Question Compter récursivement des fichiers dans un répertoire Linux


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

J'ai trouvé ça:

find DIR_NAME -type f ¦ wc -l

Mais quand je lance ceci, il renvoie l'erreur suivante.

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


442
2018-02-06 07:59


origine


Réponses:


Cela devrait fonctionner:

find DIR_NAME -type f | wc -l

Explication:

  • -type f pour inclure uniquement les fichiers.
  • | (et pas ¦) redirections find la sortie standard de la commande à wc entrée standard de la commande.
  • wc (abréviation de nombre de mots) compte les nouvelles lignes, les mots et les octets sur son entrée (docs).
  • -l compter seulement les nouvelles lignes.

Remarques: 

  • Remplacer DIR_NAME avec . pour exécuter la commande dans le dossier en cours.
  • Vous pouvez également supprimer le -type f inclure des répertoires (et des liens symboliques) dans le compte.
  • Il est possible que cette commande surestime si les noms de fichiers peuvent contenir des caractères de nouvelle ligne.

Explication de pourquoi votre exemple ne fonctionne pas:

Dans la commande que vous avez montrée, vous n'utilisez pas le "Pipe" (|) pour connecter deux commandes, mais la barre brisée (¦) que le shell ne reconnaît pas comme une commande ou quelque chose de similaire. C'est pourquoi vous obtenez ce message d'erreur.


861
2018-02-06 08:02



Pour le répertoire actuel:

find . -type f | wc -l

61
2018-04-07 10:16



Si vous voulez une ventilation du nombre de fichiers dans chaque répertoire sous votre répertoire actuel:

for i in $(find . -maxdepth 1 -type d) ; do 
    echo -n $i": " ; 
    (find $i -type f | wc -l) ; 
done

Cela peut aller sur une seule ligne, bien sûr. La parenthèse clarifie la sortie wc -l est supposé regarder (find $i -type f dans ce cas).


39
2017-10-20 05:03



Vous pouvez utiliser

$ tree

après l'installation du arbre paquet avec

$ sudo apt-get install tree

(sur une machine Linux Debian / Mint / Ubuntu).

La commande affiche non seulement le nombre de fichiers, mais aussi le nombre de répertoires, séparément. L'option -L peut être utilisée pour spécifier le niveau d'affichage maximal (qui, par défaut, est la profondeur maximale de l'arborescence).

Les fichiers cachés peuvent également être inclus en fournissant -a option.


38
2017-12-19 09:36



Sur mon ordinateur, rsync est un peu plus rapide que find | wc -l dans la réponse acceptée. Par exemple, vous pouvez compter les fichiers dans /Users/joe/ comme ça:

[joe:~] $ rsync --stats --dry-run -ax /Users/joe/ /xxx

Number of files: 173076
Number of files transferred: 150481
Total file size: 8414946241 bytes
Total transferred file size: 8414932602 bytes

La deuxième ligne a le nombre de fichiers, 150 481 dans l'exemple ci-dessus. En prime, vous obtenez également la taille totale (en octets).

Remarques:

  • la première ligne est un décompte des fichiers, répertoires, liens symboliques, etc., c'est pourquoi elle est plus grande que la deuxième ligne.
  • la --dry-run (ou -n pour faire court) option est important de ne pas transférer réellement les fichiers!
  • la /xxx Le paramètre peut être n'importe quel dossier vide ou non existant. Ne pas utiliser / ici.
  • J'ai utilisé le -x option pour "ne pas franchir les frontières du système de fichiers", ce qui signifie que si vous l'exécutez pour / et vous avez des disques durs externes connectés, il ne comptera que les fichiers sur la partition racine.

30
2018-01-22 07:23



Combinant plusieurs des réponses ici ensemble, la solution la plus utile semble être:

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 incluant des espaces entre parenthèses et même de 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 comptés. Gardez à l'esprit que cela peut prendre beaucoup de temps, en particulier si vous avez une structure de répertoires hautement imbriquée associée à un nombre élevé.


12
2017-08-29 14:53



Si vous voulez savoir combien de fichiers et de sous-répertoires existent dans le répertoire de travail actuel, vous pouvez utiliser ce fichier

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

Cela fonctionnera dans GNU flavor, et omettez simplement le -e de la commande echo pour BSD Linux (par exemple OSX).


8
2018-03-12 07:20



Si vous voulez éviter les cas d'erreur, ne pas autoriser wc -l pour voir les fichiers avec des retours à la ligne (qui compteront comme 2+ fichiers)

par exemple. Considérons un cas où nous avons un seul fichier avec un seul caractère EOL

> mkdir emptydir && cd emptydir
> touch $'file with EOL(\n) character in it'
> find -type f
./file with EOL(?) character in it
> find -type f | wc -l
2

Depuis au moins gnu wc ne semble pas avoir une option pour lire / compter une liste terminée nulle (sauf à partir d'un fichier), la solution la plus simple serait simplement de ne pas passer les noms de fichiers, mais une sortie statique chaque fois qu'un fichier est trouvé, par ex. dans le même répertoire que ci-dessus

> find -type f -exec printf '\n' \; | wc -l
1

Ou si votre find le soutient

> find -type f -printf '\n' | wc -l
1 

6
2018-03-16 01:31



Pour déterminer le nombre de fichiers présents dans le répertoire en cours, insérez ls -1 | wc -l. Cela utilise wc faire le compte du nombre de lignes (-l) dans la sortie de ls -1. Il ne compte pas les fichiers de point. Veuillez noter que ls -l (c'est un "L" plutôt qu'un "1" comme dans les exemples précédents) que j'ai utilisé dans les versions précédentes de ce HOWTO vous donnera en fait un nombre de fichiers supérieur au nombre réel. Merci à Kam Nejad pour ce point.

Si vous voulez compter uniquement les fichiers et ne pas inclure de liens symboliques (juste un exemple de ce que vous pourriez faire d'autre), vous pouvez utiliser ls -l | grep -v ^l | wc -l (c'est un "L" pas un "1" cette fois, nous voulons une "longue" liste ici). grep vérifie toute ligne commençant par "l" (indiquant un lien) et supprime cette ligne (-v).

Vitesse relative: "ls -1 / usr / bin / | wc -l" prend environ 1,03 secondes sur un 486SX25 non chargé (/ usr / bin / sur cette machine a 355 fichiers). "ls -l /usr/bin/ | grep -v ^l | wc -l"prend environ 1.19 secondes.

La source: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html


3
2017-07-02 02:58