Come posso usare il contatore di parole (wc
) e piping per contare quanti file o directory si trovano in /usr/bin
directory?
Risposta accettata:
Un approccio potrebbe essere quello di utilizzare ls
per darci un elenco dei file, ma vogliamo che questo elenco sia garantito per mostrare solo 1 file o directory per riga. Il -1
switch lo farà per noi.
$ ls -1
dir1
dir2
dir3
fileA
fileB
fileC
Esempio
Crea i dati di esempio sopra in una directory vuota.
$ mkdir dir{1..3}
$ touch file{A..C}
Controllalo:
$ ls
dir1 dir2 dir3 fileA fileB fileC
Ora per contare puoi usare wc -l
per contare il numero di righe, che corrispondono a un file o una directory in ls -1
uscita.
$ ls -1 | wc -l
6
(nota però che non include i file nascosti)
Conteggio di file o directory, ma non insieme
Per contare i file o le directory devi cambiare leggermente la tua tattica. In questo caso userei ls -l
poiché mostra cos'è una directory e cos'è un file.
Esempio
$ 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
Quindi possiamo usare grep
per filtrare directory o non directory in questo modo:
# 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
Ora usa semplicemente wc -l
di nuovo per contare quanto sopra:
# directories
$ ls -l | grep "^d" | wc -l
3
# regular files
$ ls -l | grep "^-" | wc -l
3
Tuttavia, puoi evitare wc
del tutto e usa grep
's -c
opzione:
$ ls -l | grep -c '^d'
(di nuovo, i file nascosti non sono inclusi. Nota che le directory e le normali sono due tipi di file. Ce ne sono molti altri come named pipe, collegamenti simbolici, dispositivi, socket...).
Ricorsione
Se hai bisogno di trovare i file e le directory in modo ricorsivo in /usr/bin
allora probabilmente vorrai cambiare completamente tattica e utilizzare un altro strumento chiamato find
.
Esempio
$ find /usr/bin | wc -l
4632
(anche se sopra /usr/bin
stesso è incluso nel conteggio)
Le stesse tecniche che ho usato sopra potrebbero essere impiegate usando ls
per fare qualcosa di simile ma ls
generalmente non è un buon strumento per analizzare l'output. find
d'altra parte è stato creato per questo e offre opzioni per trovare file o directory.
# find files
$ find /usr/bin -type f
# find directories
$ find /usr/bin -type d
(nota che questa volta, find
include i file nascosti (tranne .
e ..
)).
nuove righe?
Non ho mai capito perché un carattere di nuova riga sia un carattere legale da utilizzare quando si creano nomi di file o nomi di directory. Quindi i metodi discussi sopra usando wc
e ls
non farebbe concorrenza a questi, quindi usali con questo in mente.
Esempio
Crea una directory e un nome file con nuove righe.
$ mkdir $'dir4n5'
$ touch $'fileDnE'
ls
li mostra correttamente:
$ ls -1
dir1
dir2
dir3
dir4?5
fileA
fileB
fileC
fileD?E
Ma wc
conta le directory e i file che contengono newline come 2 elementi, non uno.
$ ls -1 | wc -l
10
Un metodo per aggirare questo problema, se si utilizza l'implementazione GNU di find
è utilizzare find
La capacità di stampare qualcos'altro al posto di ogni file che trova e poi contare quelli invece.
Esempio
$ find . -printf . | wc -c
9
Qui troviamo tutto nella directory corrente (tranne ..
) e stampando un punto (.
) per ciascuno, quindi contando i punti usando wc
La capacità di contare i byte invece delle righe, wc -c
.
Riferimenti
- bash – Qual è il modo migliore per contare i risultati di ricerca?