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?