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 ?

13voto

Yoory N. Points 1043

Version légèrement modifiée de Sebastian's répondre en utilisant find au lieu de du (afin d'exclure la surcharge liée à la taille des fichiers que les du doit effectuer et qui n'est jamais utilisé) :

 find ./ -mindepth 2 -type f | cut -d/ -f2 | sort | uniq -c | sort -nr

-mindepth 2 Le paramètre est utilisé pour exclure les fichiers du répertoire courant. Si vous le supprimez, vous verrez un tas de lignes comme les suivantes :

  234 dir1
  123 dir2
    1 file1
    1 file2
    1 file3
      ...
    1 fileN

(tout comme le du -)

Si vous avez besoin de compter également les fichiers du répertoire courant, utilisez cette version améliorée :

{ find ./ -mindepth 2 -type f | cut -d/ -f2 | sort && find ./ -maxdepth 1 -type f | cut -d/ -f1; } | uniq -c | sort -nr

Le résultat sera le suivant :

  234 dir1
  123 dir2
   42 .

8voto

o11c Points 1687

La solution de tous les autres présente un inconvénient ou un autre.

find -type d -readable -exec sh -c 'printf "%s " "$1"; ls -1UA "$1" | wc -l' sh {} ';'

Explication :

  • -type d Nous sommes intéressés par les annuaires.
  • -readable : Nous ne les voulons que si c'est possible pour lister les fichiers qu'ils contiennent. Notez que find émettra toujours une erreur lorsqu'il essaiera de rechercher d'autres répertoires dans ceux-ci, mais cela empêche d'appeler -exec pour eux.
  • -exec sh -c BLAH sh {} ';' pour chaque répertoire, exécuter ce fragment de script, avec $0 réglé sur sh y $1 défini au nom du fichier.
  • printf "%s " "$1" : imprimer de manière portative et minimale le nom du répertoire, suivi seulement d'un espace, et non d'une nouvelle ligne.
  • ls -1UA : liste les fichiers, un par ligne, dans l'ordre du répertoire (pour éviter de bloquer le pipe), à l'exclusion de uniquement les répertoires spéciaux . y ..
  • wc -l : compter les lignes

6voto

Sixhobbits Points 800

Cela peut aussi être fait en bouclant sur ls au lieu de find.

for f in */; do echo "$f -> $(ls $f | wc -l)"; done

Explication :

for f in */; - boucle sur tous les répertoires

do echo "$f -> - imprimer chaque nom de répertoire

$(ls $f | wc -l) - appeler ls pour ce répertoire et compter les lignes

5voto

Tuxdude Points 8652

Ceci devrait retourner le nom du répertoire suivi du nombre de fichiers dans le répertoire.

findfiles() {
    echo "$1" $(find "$1" -maxdepth 1 -type f | wc -l)
}

export -f findfiles

find ./ -type d -exec bash -c 'findfiles "$0"' {} \;

Exemple de sortie :

./ 6
./foo 1
./foo/bar 2
./foo/bar/bazzz 0
./foo/bar/baz 4
./src 4

El export -f est nécessaire car le -exec argument de find ne permet pas d'exécuter une fonction bash à moins d'invoquer bash explicitement, et vous devez exporter explicitement la fonction définie dans la portée actuelle vers le nouveau shell.

2voto

vacing Points 83

J'ai combiné La réponse de @glenn jackman et la réponse de @pcarvalho (dans la liste des commentaires, il y a un problème avec la réponse de pcarvalho car la fonction de contrôle de style supplémentaire du caractère ' ` '(backtick)).

Mon script peut accepter path comme un augument et trier la liste des répertoires comme ls -l également il peut gérer le problème de "l'espace dans le nom du fichier". .

#!/bin/bash
OLD_IFS="$IFS"
IFS=$'\n'
for dir in $(find $1 -maxdepth 1 -type d | sort); 
do
    files=("$dir"/*)
    printf "%5d,%s\n" "${#files[@]}" "$dir"
done
FS="$OLD_IFS"

Ma première réponse dans stackoverflow, et j'espère qu'elle pourra aider quelqu'un ^_^.

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