GNU/Linux >> Linux Esercitazione >  >> Linux

Come utilizzare Wc e Piping per trovare quanti file e directory si trovano in una determinata directory?

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

Correlati:trovare il miglior font per il rendering di un punto di codice?

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?

Linux
  1. Come trovare un file in Linux in tutte le directory in modo ricorsivo

  2. Come trovare e copiare determinati tipi di file da una directory all'altra in Linux

  3. Utilizzare Trova per trovare una determinata directory ed eliminare tutti i file in essa contenuti tranne una directory?

  4. Come trovare ed eliminare directory e file vuoti in Unix

  5. Come elencare in modo ricorsivo tutti i file e le directory

Trova comando in Linux (Trova file e directory)

Come rinominare file e directory in Linux

Come comprimere file e directory in Linux

Come copiare file e directory in Linux

Come utilizzare sed per trovare e sostituire la stringa nei file

Come utilizzare il comando cp per copiare file e directory