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.

1863voto

paulsm4 Points 39422

Cela devrait fonctionner :

find DIR_NAME -type f | wc -l

Explication :

  • -type f pour inclure uniquement les fichiers.
  • | ( et non ¦ ) redirige find vers la sortie standard de la commande wc l'entrée standard de la commande.
  • wc (abréviation de word count) compte les nouvelles lignes, les mots et les octets sur son entrée ( docs ).
  • -l pour ne compter que les nouvelles lignes.

Notes :

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

Explication de la raison pour laquelle votre exemple ne fonctionne pas :

Dans la commande que vous avez montrée, vous n'utilisez pas le "Pipe" ( | ) pour connecter en quelque sorte 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.

32 votes

Le site f en -type f représente les fichiers et wc -l pour les lignes de comptage des mots.

5 votes

Retirer le -type f pour inclure les répertoires dans le compte

1 votes

Existe-t-il une méthode plus rapide ? Parce que ça prend vraiment du temps si on l'applique à /

141voto

Abhishek Points 49

Pour le répertoire courant :

find -type f | wc -l

8 votes

Cette solution ne prend pas en compte les noms de fichiers qui contiennent des nouvelles lignes.

4 votes

Pour le répertoire courant, vous n'avez même pas besoin de l'option .

9 votes

En fait, sur certaines plateformes, vous faire besoin de préciser find .

110voto

Greg Bell Points 51

Si vous voulez savoir combien de fichiers se trouvent dans chaque répertoire sous votre répertoire actuel :

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

Cela peut aller sur une seule ligne, bien sûr. Les parenthèses précisent à qui appartient la sortie wc -l est censé regarder ( find $i -type f dans ce cas).

11 votes

Il pouvait se bloquer sur des répertoires dont le nom contient des espaces. En changeant la première ligne en find . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' i ; do le répare. Voir Comment lire un fichier (flux de données, variable) ligne par ligne (et/ou champ par champ) ?

4 votes

Utilisation de find pour la boucle extérieure est juste une complication inutile. for i in */ ; faire`

2 votes

Function countit { for i in $(find . -maxdepth 1 -type d) ; do file_count=$(find $i -type f | wc -l) ; echo "$file_count : $i" ; done } ; countit | sort -n -r

104voto

psmith Points 1077

Sur mon ordinateur, rsync est un peu plus rapide que find | wc -l dans la réponse acceptée :

$ rsync --stats --dry-run -ax /path/to/dir /tmp

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

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

Remarques :

  • la première ligne est un compte des fichiers, répertoires, liens symboliques, etc. tous ensemble, c'est pourquoi elle est plus grande que la deuxième ligne.
  • le site --dry-run (ou -n pour faire court), il est important de ne pas transférer réellement les fichiers !
  • J'ai utilisé le -x pour "ne pas traverser les frontières du système de fichiers", ce qui signifie que si vous l'exécutez pour / et que vous avez des disques durs externes attachés, il ne comptera que les fichiers sur la partition racine.

67voto

lev Points 3

Vous pouvez utiliser

$ tree

après avoir installé le arbre paquet avec

$ sudo apt-get install tree

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

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 maximum d'affichage (qui, par défaut, est la profondeur maximum de l'arbre des répertoires).

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

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