#1 Le 07/10/2008, à 16:48
- daftdef
Commandes bash : performance pour compter le nb de fichiers d'un rép
Bonjour à tous
Je cherche à compter le nombre de fichiers d'un répertoire
Actuellement j'utilise la commande suivante
find mondossierquilestbeau -type f | wc -l
qui me donne bien le résultat escompté.
Cependant, je cherche une commande susceptible de faire la même chose, mais plus rapidement (le dossier compte un peu plus de 80 000 fichiers et s'exécutent en environ 2 minutes 30. Pour bien faire, il faudrait une exécution au moins deux fois plus rapide.)
Si il existe une commande (autre que du, permettant d'obtenir le poids des fichiers de manière rapide, je suis preneur aussi)
Je ne cherche pas spécialement à réinventer la roue... Si il n'existe pas plus rapide que le find et le du, je m'en contenterai... Mais comme je ne sais pas vraiment si ces commandes sont vraiment optimisées, je préfère poser la question
merci d'avance pour vos réponses
#2 Le 07/10/2008, à 18:04
- kordan
Re : Commandes bash : performance pour compter le nb de fichiers d'un rép
Salut
Je ne connais pas de commandes mais tu peux essayer un script pyton (ou autres), ça sera peut-être plus rapide :
#!/usr/bin/env python
import os, sys
n = 0
for f in os.walk(sys.argv[1]):
n += len(f[2])
print n
puis tu lances : script.py 'mondossierquilestbeau'
a+
#3 Le 07/10/2008, à 18:11
- frafa
Re : Commandes bash : performance pour compter le nb de fichiers d'un rép
lo,
peut etre
cd /media && ls -AR | wc -l
sinon passer avec une recherche dans base de données
genre updatedb et locate...
Dernière modification par frafa (Le 07/10/2008, à 18:12)
Hors ligne
#4 Le 07/10/2008, à 18:18
- aeacides
Re : Commandes bash : performance pour compter le nb de fichiers d'un rép
faudrait que tu fasses un benchmark en fait de toutes ces opérations pour voir laquelle est la plus rapide pour un volume donné ...
Mais si je ne me trompe pas, Perl reste un langage scripté de mise pour ce genre de truc. Qu'importe celui que tu utilises, tant que ça fonctionne .... Mais j'aurais tendance a croire que Bash est plus rapide que Python pour ce genre d'opération, mais je touche du bois.
Dernière modification par aeacides (Le 07/10/2008, à 18:19)
http://www.q-be.ca
Hors ligne
#5 Le 07/10/2008, à 18:21
- lawl
Re : Commandes bash : performance pour compter le nb de fichiers d'un rép
tu n'a que des fichier dedans ?
Parce que peut etre qu'un
ls -1 | wc -l
est peut etre plus rapide mais ca compte les dossiers.
Dernière modification par lawl (Le 07/10/2008, à 18:23)
Hors ligne
#6 Le 07/10/2008, à 21:27
- Link31
Re : Commandes bash : performance pour compter le nb de fichiers d'un rép
Je ne pense pas que tu puisses beaucoup optimiser cette opération. Il n'y a pas de commande retournant le nombre de fichiers qui ne nécessite pas de lire tous les dossier un par un.
C'est la vitesse du disque dur qui plombe le temps d'exécution (et dans une moindre mesure, la vitesse du système de fichiers). Le programme peut-être écrit dans n'importe quel langage, ça ne changera pas grand chose.
Si tu veux aller plus vite, il y a plusieurs possibilités :
- trouve un disque dur plus rapide
- change de système de fichiers, par exemple pour reiser4
- copie tous les fichiers en RAM (dans un tmpfs, ou dans le cache en lisant tous les dossiers à l'avance) avant de lancer la commande
Hors ligne
#7 Le 07/10/2008, à 22:25
- kordan
Re : Commandes bash : performance pour compter le nb de fichiers d'un rép
Je ne pense pas que tu puisses beaucoup optimiser cette opération. ...
Le programme peut-être écrit dans n'importe quel langage, ça ne changera pas grand chose.
Ce n'est pas ce que montrent les deux ou trois tests que je viens de faire.
Le script python que j'ai donné plus haut est assez nettement plus rapide que "find dossier -type f | wc -l". Il a même été trois fois plus rapide sur un gros dossier stocké sur un disque dur externe usb2.
Il faudrait voir si find à une option pour cela, ça accélérerait peut-être l'opération.
Sinon il doit y avoir une erreur dans le premier poste. 2 minutes 30 pour 80.000 fichiers, ça serait énorme; peut-être 2 seconde 30 ou alors il y a beaucoup plus de fichiers (ou alors l'accès au disque est vraiment extrêmement lent et dans ce cas effectivement changer de programme de servirait pas à grand chose).
#8 Le 07/10/2008, à 22:41
- Link31
Re : Commandes bash : performance pour compter le nb de fichiers d'un rép
Ce n'est pas ce que montrent les deux ou trois tests que je viens de faire.
Le script python que j'ai donné plus haut est assez nettement plus rapide que "find dossier -type f | wc -l". Il a même été trois fois plus rapide sur un gros dossier stocké sur un disque dur externe usb2.
Je suppose que tu as comparé le temps d'exécution en lançant find ..., puis en lançant ton script. Rien de surprenant dans ce cas.
Ça devrait remettre les choses en place pour un vrai benchmark :
echo 1 | sudo tee /proc/sys/vm/drop_caches
Il faudrait voir si find à une option pour cela, ça accélérerait peut-être l'opération.
Oui, une option du genre -fast ou -optimized... Voire une macro du type #define OPTIMIZE_CODE ou quelque chose de ce genre...
Tu as plein d'exemples d'"options" de ce type sur le forum Gentoo. Cherche le terme "ricer"
Hors ligne
#9 Le 07/10/2008, à 22:53
- kordan
Re : Commandes bash : performance pour compter le nb de fichiers d'un rép
ah oui, tu as raison
Le temps est le même en réalité
#10 Le 08/10/2008, à 08:20
- daftdef
Re : Commandes bash : performance pour compter le nb de fichiers d'un rép
merci pour les réponses...
Alors en vrac :
peut etre
cd /media && ls -AR | wc -l
sinon passer avec une recherche dans base de données
le ls ou le find, c'est kif kif en terme de temps d'exécution (le find est un peu plus rapide quand même !!)
Je ne pense pas que tu puisses beaucoup optimiser cette opération. Il n'y a pas de commande retournant le nombre de fichiers qui ne nécessite pas de lire tous les dossier un par un.
C'est la vitesse du disque dur qui plombe le temps d'exécution (et dans une moindre mesure, la vitesse du système de fichiers). Le programme peut-être écrit dans n'importe quel langage, ça ne changera pas grand chose.
Si tu veux aller plus vite, il y a plusieurs possibilités :
- trouve un disque dur plus rapide
- change de système de fichiers, par exemple pour reiser4
- copie tous les fichiers en RAM (dans un tmpfs, ou dans le cache en lisant tous les dossiers à l'avance) avant de lancer la commande
C'est bien ça qui me fait peur. M'enfin je m'en arrangerai.
Sinon il doit y avoir une erreur dans le premier poste. 2 minutes 30 pour 80.000 fichiers, ça serait énorme; peut-être 2 seconde 30 ou alors il y a beaucoup plus de fichiers (ou alors l'accès au disque est vraiment extrêmement lent et dans ce cas effectivement changer de programme de servirait pas à grand chose).
Pas d'erreur, le disque a énormément d'accès et est très chargé (serveur de fichier) et il s'agit d'un montage (ce qui n'arrange sans doute rien à la rapidité d'exécution !!)
ah oui, tu as raison
Le temps est le même en réalité
ouf !! mettre les mains dans le python, hum ... ça me faisait un peu peur quand même !!
#11 Le 08/10/2008, à 08:35
- cep
Re : Commandes bash : performance pour compter le nb de fichiers d'un rép
merci pour les réponses...
Alors en vrac :
peut etre
cd /media && ls -AR | wc -l
sinon passer avec une recherche dans base de donnéesle ls ou le find, c'est kif kif en terme de temps d'exécution (le find est un peu plus rapide quand même !!)
Oui, pas de différ'ence significative entre find et ls. Testé sur 180.000 fichiers.
Il me semble avoir lu que tu voulais uniquement décompter les fichiers et répertoires, mais exclure du décompte le nombre de répertoires, ce que ne fait pas ta commande.
ls -lRA ton_rep | grep -c '^-'
devrait en tenir compte.
Hors ligne
#12 Le 08/10/2008, à 08:46
- daftdef
Re : Commandes bash : performance pour compter le nb de fichiers d'un rép
en fait ce n'est pas exactement ça.
dans un premier temps, je compte les éventuels répertoires présents. Comme je ne veux pas avoir de répertoire, si il y en a plus d'un, ça fait erreur et le comptage des fichiers ne s'exécute pas.
Alors à moins qu'un répertoire ne se créer dans le laps de temps d'exécution de mes 2 commandes (ce qui ne serait pas de bol !!), je n'ai pas besoin de me soucier de la prise en compte ou non des répertoires lorsque je compte mes fichiers (et puis ça doit gagner en perf du coup)
Je suis amené à lancer ces commandes régulièrement via un script, donc si un répertoire n'est pas détecté à la 1ère exécution, il le sera à la 2nde. En attendant, ce n'est pas dramatique
#13 Le 08/10/2008, à 10:41
- cep
Re : Commandes bash : performance pour compter le nb de fichiers d'un rép
tu as aussi tree qui est rapide.
Par exemple :
tree -a ton_repertoire |egrep "directories|files "
va décompter répertoires et fichiers.
Tu peux demamder à ce qu'il n'affiche que fichiers bien sûr.
tree -a |egrep "directories|files "| awk '{ print $3}'
Hors ligne