it-swarm.it

Come posso ottenere un conteggio dei file in una directory usando la riga di comando?

Ho una directory con un gran numero di file. Non vedo un interruttore ls per fornire il conteggio. C'è qualche magia da riga di comando per ottenere un conteggio di file?

219
Blake

Utilizzando un'ampia definizione di "file"

ls | wc -l

(nota che non conta i file nascosti e presuppone che i nomi dei file non contengano caratteri di nuova riga).

Per includere file nascosti (tranne . e ..) ed evitare problemi con i caratteri di nuova riga, il modo canonico è:

find . ! -name . -Prune -print | grep -c /

O ricorsivamente:

find .//. ! -name . -print | grep -c //
279
James Roth

Per una definizione ristretta del file:

 find . -maxdepth 1 -type f | wc -l
35
Maciej Piechotka
ls -1 | wc -l

...

$ ls --help | grep -- '  -1'
    -1                         list one file per line

...

$ wc --help | grep -- '  -l'
    -l, --lines            print the newline counts

PS: Nota ls - <number-one> | wc - <letter-l>

15
nicomen

Ho trovato du --inodes utile, ma non sono sicuro di quale versione di du richiede. Dovrebbe essere sostanzialmente più veloce di approcci alternativi usando find e wc.

Su Ubuntu 17.10, funziona come segue:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

Unisci con | sort -nr per ordinare in ordine decrescente per numero di inode contenenti.

12
krlmlr

Probabilmente la risposta più completa usando la coppia ls/wc è

ls -Aq | wc -l

se si desidera contare i file di punti e

ls -q | wc -l

altrimenti.

  • -A È per contare i file di punti, ma omettere . E ...
  • -q Crea ls sostituisci i caratteri non grafici, in particolare il carattere di nuova riga, con ?, Creando 1 riga di output per ogni file

Per ottenere un output di una riga da ls nel terminale (ovvero senza collegarlo a wc), è necessario aggiungere l'opzione -1.

(comportamento di ls testato con coreutils 8.23)

12
Frax

Se conosci la directory corrente contiene almeno un file non nascosto:

set -- *; echo "$#"

Questo è ovviamente generalizzabile per qualsiasi glob.

In uno script, questo ha l'effetto collaterale a volte sfavorevole di sovrascrivere i parametri posizionali. È possibile aggirare ciò utilizzando una subshell o con una funzione (versione Bourne/POSIX) come:

count_words () {
  eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"

Una soluzione alternativa è $(ls -d -- * | wc -l). Se il glob è *, Il comando può essere abbreviato in $(ls | wc -l). L'analisi dell'output di ls mi mette sempre a disagio, ma qui dovrebbe funzionare fintanto che i nomi dei tuoi file non contengono newline o ls li sfugge. E $(ls -d -- * 2>/dev/null | wc -l) ha il vantaggio di gestire il caso di un glob non corrispondente con grazia (cioè, restituisce 0 in quel caso, mentre il metodo set * Richiede un test fiddly se il glob potrebbe essere vuoto ).

Se i nomi dei file possono contenere caratteri di nuova riga, un'alternativa è utilizzare $(ls -d ./* | grep -c /).

Una qualsiasi di quelle soluzioni che fanno affidamento sul passaggio dell'espansione di un glob a ls potrebbe non riuscire con un errore elenco argomenti troppo lungo se ci sono molti file corrispondenti.

Durante l'utilizzo della coppia ls/wc se stiamo aggiungendo -U sarà molto più veloce (non ordinare).

ls -AqU | wc -l
5
Jbnair

Dopo aver installato il comando tree, basta digitare:

tree

Se vuoi anche file nascosti:

tree -a

Se stai usando Debian/Mint/Ubuntu Linux, digita il seguente comando per installare il comando tree:

Sudo apt-get install tree

L'opzione -L viene utilizzata per specificare il livello massimo di visualizzazione dell'albero delle directory. Il comando tree non conta solo il numero di file, ma anche il numero di directory, considerando tutti i livelli dell'albero di directory che desideri.

4
lev
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1 lo renderà non ricorsivo, find è ricorsivo per impostazione predefinita
  • -type f includerà solo i file
  • -printf . è un tocco carino. stampa un punto per ogni file anziché il nome file, e ora è in grado di gestire qualsiasi nome file e salva anche i dati; non ci resta che contare i punti :)
  • | wc -c conta i caratteri
3
aude

Nessuna pipa, nessuna copia di stringa, nessuna forchetta, solo una riga di base

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
1
DaboD

Su Linux, per rendere il comando molto robusto e gestire i file che potrebbero avere nuove righe nel loro nome, utilizzare questo:

find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c

Questo ci salva dal calvario dell'analisi dell'output ls.


Relazionato:

1
codeforester

Ecco un'altra tecnica sulla falsariga di na Gilles pubblicata :

Word_count () { local c=("[email protected]"); echo "${#c[@]}"; }
file_count=$(Word_count *)

che crea un array con 13.923 elementi (se sono quanti file ci sono).

find . -type f -maxdepth 1 |  wc -l 

Questo può elencare solo i file nella directory corrente.

1
srpatch

Migliorare alcune risposte fornite prima, ma questa volta facendo esplicitamente.

$ tree -L 1 | tail -n 1 | cut -d " " -f 3

È degno di nota l'uso di alcuni comandi amati come tail e cut. Inoltre, tieni presente che l'albero non è disponibile per impostazione predefinita. Il comando sopra prima acquisisce informazioni sulla directory al livello 1, quindi ottiene l'ultima riga tail -n 1 dove è il nostro obiettivo e finiamo con cut per prendere la terza parola.

Ad esempio, la localizzazione in /:

/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1

Quindi, che ne dici di chiedere il numero di directory?

0
jonaprieto

Prova questo spero che questa risposta ti possa aiutare

echo $((`ls -l | wc -l` -1 ))
0
Tiger

Puoi verificare con:

ls -l | grep -v ^l | wc -l
0
AMIC MING