2010-10-12 21:41:12 +0000 2010-10-12 21:41:12 +0000
217
217

Contate ricorsivamente tutti i file in una directory

Possibile duplicare: Come posso contare il numero di cartelle in un drive usando Linux?

Ho un albero delle directory molto profondo sul mio Linux box. Vorrei contare tutti i file in quel percorso, incluse tutte le sottodirectory.

Per esempio, dato questo albero di directory:

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

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

Come posso farlo più facilmente? Ho una soluzione che coinvolge uno script Python che ho scritto, ma perché non è facile come eseguire ls | wc o simili?

Risposte (5)

364
364
364
2010-10-12 21:44:53 +0000

find . -type f | wc -l

Spiegazione: find . -type f trova tutti i file ( ** tipo f** ) in questa ( . ) directory e in tutte le sottodirectory, i nomi dei file vengono poi stampati in modo standard uno per riga.

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

Insieme contano tutti i vostri file.

49
49
49
2011-03-28 22:00:38 +0000

Le risposte di cui sopra rispondono già alla domanda, ma aggiungerò che se si usa find senza argomenti (tranne che per la cartella dove si vuole che la ricerca avvenga) 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 ogni nome per verificarne il tipo - omettendola si evita di farlo.

Questo ha la differenza di restituire il conteggio dei file più le cartelle invece dei soli file, ma almeno per me è sufficiente dato che io uso questo per trovare quali cartelle hanno enormi quantità di file che ci mettono una vita a copiarli e comprimerli. Il conteggio delle cartelle mi permette ancora di trovare le cartelle con la maggior parte dei file, ho bisogno di più velocità che di precisione.

26
26
26
2010-10-12 21:56:03 +0000

Per i file:

find -type f | wc -l
``` ```
find -mindepth 1 -type d | wc -l

Per le directory:

&001 &001

Entrambi funzionano nella directory di lavoro corrente.

8
8
8
2010-10-13 01:58:12 +0000

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 due volte find se si desidera cercare file e directory

8
8
8
2010-10-13 14:26:17 +0000

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