GNU/Linux >> Tutoriels Linux >  >> Linux

Comment utiliser Wc And Piping pour trouver combien de fichiers et de répertoires se trouvent dans un certain répertoire ?

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 .. )).

En relation :Trouver la meilleure police pour afficher un point de code ?

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 ?

Linux
  1. Comment rechercher et copier certains types de fichiers d'un répertoire à un autre sous Linux

  2. Comment rechercher et supprimer des répertoires et des fichiers vides sous Unix

  3. Comment rechercher et supprimer des répertoires et des fichiers vides sous Linux

  4. Comment puis-je rechercher des répertoires et trouver des fichiers qui correspondent à regex ?

  5. Comment puis-je trouver tous les fichiers et répertoires accessibles en écriture par un utilisateur spécifique ?

Rechercher la commande sous Linux (Rechercher des fichiers et des répertoires)

Comment renommer des fichiers et des répertoires sous Linux

Comment compresser des fichiers et des répertoires sous Linux

Comment copier des fichiers et des répertoires sous Linux

Comment utiliser sed pour rechercher et remplacer une chaîne dans des fichiers

Comment utiliser la commande cp pour copier des fichiers et des répertoires