154 votes

Comment compter le nombre de fichiers dans chaque répertoire ?

Je suis capable de lister tous les répertoires par

find ./ -type d

J'ai essayé de lister le contenu de chaque répertoire et de compter le nombre de fichiers dans chaque répertoire en utilisant la commande suivante

find ./ -type d | xargs ls -l | wc -l

Mais cela additionne le nombre total de lignes retournées par

find ./ -type d | xargs ls -l

Y a-t-il un moyen de compter le nombre de fichiers dans chaque répertoire ?

271voto

Ceci imprime le nombre de fichiers par répertoire pour le niveau de répertoire actuel :

du -a | cut -d/ -f2 | sort | uniq -c | sort -nr

146voto

glenn jackman Points 69748

En supposant que vous avez GNU find, laissez-le trouver les répertoires et laissez bash faire le reste :

find . -type d -print0 | while read -d '' -r dir; do
    files=("$dir"/*)
    printf "%5d files in directory %s\n" "${#files[@]}" "$dir"
done

87voto

DCZ Points 170
find . -type f | cut -d/ -f2 | sort | uniq -c
  • find . -type f pour trouver tous les éléments du type file dans le dossier actuel et ses sous-dossiers
  • cut -d/ -f2 pour découper leur dossier spécifique
  • sort pour trier la liste des noms de dossiers
  • uniq -c pour retourner le nombre de fois que chaque nom de dossier a été compté

21voto

Jonathan Leffler Points 299946

Vous pourriez vous arranger pour trouver tous les fichiers, supprimer les noms de fichiers, ce qui vous laisserait une ligne contenant uniquement le nom du répertoire de chaque fichier, puis compter le nombre de fois où chaque répertoire apparaît :

find . -type f |
sed 's%/[^/]*$%%' |
sort |
uniq -c

Le seul problème est que les noms de fichiers ou de répertoires contiennent un caractère de nouvelle ligne, ce qui est assez peu probable. Si vous devez vraiment vous soucier des retours à la ligne dans les noms de fichiers ou de répertoires, je vous suggère de les trouver et de les corriger pour qu'ils ne contiennent plus de retours à la ligne (et de persuader discrètement le coupable de son erreur).


Si vous êtes intéressé par le comptage des fichiers dans chaque sous-répertoire du répertoire courant, en comptant tous les fichiers dans n'importe quel sous-répertoire en même temps que les fichiers dans le sous-répertoire immédiat, alors j'adapterais la commande sed pour imprimer uniquement le répertoire de premier niveau :

find . -type f |
sed -e 's%^\(\./[^/]*/\).*$%\1%' -e 's%^\.\/[^/]*$%./%' |
sort |
uniq -c

Le premier modèle capture le début du nom, le point, la barre oblique, le nom jusqu'à la barre oblique suivante et la barre oblique, et remplace la ligne avec juste la première partie, ainsi :

./dir1/dir2/file1

est remplacé par

./dir1/

Le deuxième remplacement capture les fichiers directement dans le répertoire courant ; ils n'ont pas de slash à la fin, et ceux-là sont remplacés par ./ . Le tri et le comptage ne portent alors que sur le nombre de noms.

15voto

Austin Phillips Points 6217

Voici une façon de le faire, mais probablement pas la plus efficace.

find -type d -print0 | xargs -0 -n1 bash -c 'echo -n "$1:"; ls -1 "$1" | wc -l' --

Donne une sortie comme celle-ci, avec le nom du répertoire suivi du nombre d'entrées dans ce répertoire. Notez que le compte de sortie inclura également les entrées du répertoire, ce qui n'est peut-être pas ce que vous voulez.

./c/fa/l:0
./a:4
./a/c:0
./a/a:1
./a/a/b:0

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