Conteggio ricorsivo di tutti i file in una directory [duplicato]


199

Possibile duplicato:
come posso contare il numero di cartelle in un'unità usando Linux?

Ho un albero di directory davvero profondo sul mio box Linux. Vorrei contare tutti i file in quel percorso, comprese tutte le sottodirectory.

Ad esempio, dato questo albero di directory:

/home/blue
/home/red
/home/dir/green
/home/dir/yellow
/home/otherDir/

Se passo /home, vorrei che restituisse quattro file. Oppure, punti bonus se restituisce quattro file e due directory. Fondamentalmente, voglio l'equivalente di fare clic con il tasto destro su una cartella su Windows e selezionare le proprietà e vedere quanti file / cartelle sono contenuti in quella cartella.

Come posso farlo più facilmente? Ho una soluzione che coinvolge uno script Python che ho scritto, ma perché non è così semplice come in esecuzione ls | wco simile?


Non esattamente quello che stai cercando, ma per ottenere un totale complessivo molto rapido, se il tuo locatedatabase è aggiornato: locate /some/path | wc -l(o sul mio Mac:) locate -c /some/path. Ma: questo conterà anche i file /this/other/path/with/some/pathe conterà le cartelle stesse.
Arjan,

A proposito, questo è un problema diverso, ma strettamente correlato (contando tutte le directory su un disco) e la soluzione: superuser.com/questions/129088/…
Amanda

Risposte:


341

find . -type f | wc -l

Spiegazione:
find . -type ftrova tutti i file ( -type f ) in questa directory ( . ) E in tutte le sottodirectory, i nomi dei file vengono quindi stampati su uno standard per riga.

Questo viene quindi convogliato | in wc(conteggio parole) l' -lopzione dice a wc di contare solo le righe del suo input.

Insieme contano tutti i tuoi file.


1
Non si tratta dell'errore off-by-one a causa dell'ultima riga finddell'output
RobertDeRose,

per contare SOLO le directory, usa '-type d' invece di '-type f': D
MevlütÖzdemir

1
Quando non ci sono file trovati, il risultato è1
Dylanthepiguy

47

Le risposte di cui sopra rispondono già alla domanda, ma aggiungerò che se si utilizza trova senza argomenti (ad eccezione della cartella in cui si desidera eseguire la ricerca) come in:

find . | wc -l

la ricerca va molto più veloce, quasi istantanea, o almeno lo fa per me. Questo perché la clausola type deve eseguire una chiamata di sistema stat () su ciascun nome per verificarne il tipo, omettendola si evita di farlo.

Ciò ha la differenza di restituire il conteggio dei file più le cartelle anziché solo i file, ma almeno per me è sufficiente poiché lo uso principalmente per trovare quali cartelle hanno enormi quantità di file che impiegano un'eternità a copiarli e comprimerli. Il conteggio delle cartelle mi consente ancora di trovare le cartelle con la maggior parte dei file, ho bisogno di più velocità che precisione.


1
Quando non ci sono file trovati, il risultato è1
Dylanthepiguy

25

Per i file:

find -type f | wc -l

Per le directory:

find -mindepth 1 -type d | wc -l

Entrambi funzionano nella directory di lavoro corrente.


1
Quando non ci sono file trovati, il risultato è1
Dylanthepiguy

8

Con bash 4+

shopt -s globstar
for file in **/*
do
  if [ -d "$file" ];then
    ((d++))
  elif [ -f "$file" ];then
     ((f++))
  fi
done
echo "number of files: $f"
echo "number of dirs: $d"

Non è necessario chiamare find due volte se si desidera cercare file e directory


8

Leggero aggiornamento alla risposta accettata, se si desidera un conteggio di dirs e simili

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn

1
Su un Mac / BSD : find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn(Qui, digitare %Tè vuoto per un file normale, un asterisco per un file eseguibile o una barra per una cartella; quindi %HTè necessario o del testo aggiuntivo per evitare che lo spazio non venga conteggiato, come > %T. )
Arjan,

Mi dà "trova: opzione illegale - e" sul mio Mac 10.13.6
K.-Michael Aye,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.