Comment puis-je utiliser le compteur de mots (wc
) et une canalisation pour compter le nombre de fichiers ou de répertoires dans /usr/bin
répertoire ?
Réponse acceptée :
Une approche serait d'utiliser ls
pour nous donner une liste des fichiers, mais nous voulons que cette liste soit garantie de n'afficher qu'un seul fichier ou répertoire par ligne. Le -1
switch le fera pour nous.
$ ls -1
dir1
dir2
dir3
fileA
fileB
fileC
Exemple
Créez les exemples de données ci-dessus dans un répertoire vide.
$ mkdir dir{1..3}
$ touch file{A..C}
Vérifiez-le :
$ ls
dir1 dir2 dir3 fileA fileB fileC
Maintenant, pour compter, vous pouvez utiliser wc -l
pour compter le nombre de lignes, qui correspondent à un fichier ou un répertoire dans le ls -1
sortie.
$ ls -1 | wc -l
6
(notez cependant qu'il n'inclut pas les fichiers cachés)
Compter des fichiers ou des répertoires, mais pas ensemble
Pour compter les fichiers ou les répertoires, vous devez modifier légèrement votre tactique. Dans ce cas, j'utiliserais ls -l
puisqu'il montre ce qu'est un répertoire et ce qu'est un fichier.
Exemple
$ ls -l
total 12
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir1
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir2
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir3
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileA
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileB
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileC
Ensuite, nous pouvons utiliser grep
pour filtrer les répertoires ou les non-répertoires comme suit :
# directories
$ ls -l | grep "^d"
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir1
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir2
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir3
# regular files
$ ls -l | grep "^-"
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileA
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileB
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileC
Maintenant, utilisez simplement wc -l
à nouveau pour compter ce qui précède :
# directories
$ ls -l | grep "^d" | wc -l
3
# regular files
$ ls -l | grep "^-" | wc -l
3
Cependant, vous pouvez éviter wc
ensemble, et utilisez grep
's -c
choix :
$ ls -l | grep -c '^d'
(encore une fois, les fichiers cachés ne sont pas inclus. Notez que les répertoires et les fichiers réguliers sont deux types de fichiers. Il en existe bien d'autres comme les canaux nommés, les liens symboliques, les périphériques, les sockets…).
Récursivité
Si vous avez besoin de trouver les fichiers et répertoires de manière récursive sous /usr/bin
alors vous voudrez probablement changer complètement de tactique et utiliser un autre outil appelé find
.
Exemple
$ find /usr/bin | wc -l
4632
(bien qu'au-dessus de /usr/bin
lui-même est inclus dans le décompte)
Les mêmes techniques que j'ai utilisées ci-dessus pourraient être utilisées avec ls
faire quelque chose de similaire mais ls
n'est généralement pas un bon outil pour analyser la sortie. find
d'autre part a été construit pour cela, et propose des commutateurs pour trouver soit des fichiers, soit des répertoires.
# find files
$ find /usr/bin -type f
# find directories
$ find /usr/bin -type d
(notez que cette fois, find
inclut des fichiers cachés (sauf .
et ..
)).
nouvelles lignes ?
Je n'ai jamais compris pourquoi un caractère de nouvelle ligne est un caractère légal à utiliser lors de la création de noms de fichiers ou de noms de répertoires. Ainsi, les méthodes décrites ci-dessus en utilisant wc
et ls
ne les supporterait pas, alors utilisez-les en gardant cela à l'esprit.
Exemple
Créez un répertoire et un nom de fichier avec des retours à la ligne.
$ mkdir $'dir4n5'
$ touch $'fileDnE'
ls
les affiche correctement :
$ ls -1
dir1
dir2
dir3
dir4?5
fileA
fileB
fileC
fileD?E
Mais wc
compte les répertoires et les fichiers qui contiennent des retours à la ligne comme 2 éléments, pas un.
$ ls -1 | wc -l
10
Une méthode pour contourner ce problème, si vous utilisez l'implémentation GNU de find
est d'utiliser find
la capacité d'imprimer quelque chose d'autre à la place de chaque fichier qu'il trouve, puis de les compter à la place.
Exemple
$ find . -printf . | wc -c
9
Ici on retrouve tout dans le répertoire courant (sauf ..
) et en imprimant un point (.
) pour chacun, puis en comptant les points en utilisant wc
capacité de compter les octets au lieu des lignes, wc -c
.
Références
- bash – Quelle est la meilleure façon de compter les résultats de la recherche ?