1099 votes

Compter récursivement les fichiers dans un répertoire Linux

Comment puis-je compter récursivement les fichiers dans un répertoire Linux ?

J'ai trouvé ça :

find DIR_NAME -type f ¦ wc -l

Mais lorsque je l'exécute, il renvoie l'erreur suivante.

find : les chemins doivent précéder l'expression : ¦

91 votes

Vous confondez la barre cassée ¦ (ASCII 166) avec la barre verticale | (ASCII 124) utilisé pour Pipeline UNIX .

12 votes

@SkippyleGrandGourou Ça ne s'appelle pas un tuyau ?

38 votes

DaveStephens Oui, on l'appelle aussi comme ça. On l'appelle aussi trait de Sheffer, verti-bar, vbar, bâton, ligne verticale, barre verticale, barre, obélisque, glidus.

56voto

hek2mgl Points 38787

Puisque les noms de fichiers sous UNIX peuvent contenir des nouvelles lignes (oui, des nouvelles lignes), wc -l pourrait compter trop de fichiers. J'imprimerais un point pour chaque fichier, puis je compterais les points :

find DIR_NAME -type f -printf "." | wc -c

Note : Le -printf L'option ne fonctionne qu'avec find de GNU findutils. Vous devrez peut-être l'installer, sur un Mac par exemple.

24voto

Sebastian Meine Points 6379

En combinant plusieurs des réponses données ici, la solution la plus utile semble être la suivante :

find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' |
sort -n

Il peut gérer des choses bizarres comme les noms de fichiers qui incluent des espaces, des parenthèses et même des nouvelles lignes. Il trie également la sortie par le nombre de fichiers.

Vous pouvez augmenter le nombre après -maxdepth pour que les sous-répertoires soient également comptabilisés. Gardez à l'esprit que cela peut potentiellement prendre beaucoup de temps, en particulier si vous avez une structure de répertoires très imbriqués en combinaison avec un taux élevé de -maxdepth numéro.

18voto

Santrix Points 695

Si vous voulez savoir combien de fichiers et de sous-répertoires existent à partir du répertoire de travail actuel, vous pouvez utiliser cette ligne simple

find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find {} | wc -l) {}' | sort -n

Cela fonctionnera à la sauce GNU, et il suffit d'omettre le -e de la commande echo pour BSD linux (par exemple OSX).

17voto

Leon li Points 2431

Si ce dont vous avez besoin est de compter un type de fichier spécifique récursivement que vous pouvez faire :

find YOUR_PATH -name '*.html' -type f | wc -l 

-l est juste pour afficher le nombre de lignes dans la sortie.

Si vous devez exclure certains dossiers, utilisez la fonction -not -path

find . -not -path './node_modules/*' -name '*.js' -type f | wc -l

16voto

Franck Dernoncourt Points 4769

Vous pouvez utiliser la commande ncdu . Il comptera récursivement le nombre de fichiers qu'un répertoire Linux contient. Voici un exemple de sortie :

enter image description here

Il dispose d'une barre de progression, ce qui est pratique si vous avez de nombreux fichiers :

enter image description here

Pour l'installer sur Ubuntu :

sudo apt-get install -y ncdu

Benchmark : J'ai utilisé https://archive.org/details/cv_corpus_v1.tar (380390 fichiers, 11 GB) comme le dossier où l'on doit compter le nombre de fichiers.

  • find . -type f | wc -l : environ 1m20s pour terminer
  • ncdu : environ 1m20s pour terminer

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X