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 : ¦
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 : ¦
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 :
DIR_NAME
con .
pour exécuter la commande dans le dossier actuel.-type f
pour inclure les répertoires (et les liens symboliques) dans le compte.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.
Le site f
en -type f
représente les fichiers et wc -l
pour les lignes de comptage des mots.
Existe-t-il une méthode plus rapide ? Parce que ça prend vraiment du temps si on l'applique à /
Cette solution ne prend pas en compte les noms de fichiers qui contiennent des nouvelles lignes.
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).
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) ?
Utilisation de find
pour la boucle extérieure est juste une complication inutile. for i in */
; faire`
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
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 :
--dry-run
(ou -n
pour faire court), il est important de ne pas transférer réellement les fichiers !-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.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 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.
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.
83 votes
@zenith Je l'appelle simplement Bob.
28 votes
Dans la RFC20, il est appelé "ligne verticale". "Pipe" est le nom de l'opérateur shell, plutôt que le nom du symbole. Tout comme
*
est le caractère ASCII "astérisque", mais "times" dans certains autres contextes.0 votes
@slim C'est de loin la réponse la plus utile. De loin, et même plus.