Dimensione totale del contenuto di tutti i file in una directory [chiuso]


103

Quando uso lso du, ottengo la quantità di spazio su disco occupata da ciascun file.

Ho bisogno della somma totale di tutti i dati in file e sottodirectory che otterrei se aprissi ogni file e contassi i byte. Punti bonus se riesco a ottenerlo senza aprire ogni file e contare.


1
lsmostra effettivamente il numero di byte in ogni file, non la quantità di spazio su disco. È sufficiente per le tue esigenze?
Greg Hewgill

3
Nota che dunon può essere utilizzato per rispondere a questa domanda. Mostra la quantità di spazio su disco che la directory occupa sul disco (i dati dei file più la dimensione delle meta-informazioni del file system ausiliario). L' duoutput può essere anche inferiore alla dimensione totale di tutti i file. Ciò può accadere se il file system può memorizzare dati compressi sul disco o se vengono utilizzati collegamenti fisici. Le risposte corrette si basano su lse find. Vedi le risposte di Nelson e di bytepan qui, o questa risposta: unix.stackexchange.com/a/471061/152606
anton_rh

Risposte:


108

Se vuoi la 'dimensione apparente' (cioè il numero di byte in ogni file), non la dimensione occupata dai file sul disco, usa l' opzione -bo --bytes(se hai un sistema Linux con GNU coreutils ):

% du -sbh <directory>

1
funziona sulle mie nuove red hat box, sfortunatamente non sulla mia Dev box incorporata.
Arthur Ulfeldt

3
C'è un modo semplice per mostrare la "dimensione apparente" in un formato leggibile dall'uomo? Quando si utilizza du -shb(come suggerito da questa risposta), l' -bimpostazione sembra sovrascrivere l' -himpostazione.
Mathias Bynens

6
@MathiasBynens Inverte l'ordine dei flag (es. Du -sbh <dir>). Per me va bene.
Luis E.

2
@MathiasBynensdu -sh --apparent-size /dir/
Jongosi

2
@Arkady Ho provato la tua soluzione su CentOS e Ubuntu e c'è un piccolo errore. Vuoi "du -sbh". La bandiera "-h" deve essere l'ultima.
theJollySin

46

Usa du -sb:

du -sb DIR

Facoltativamente, aggiungi l' hopzione per un output più intuitivo:

du -sbh DIR

4
-b sembra essere un'opzione illegale per MacOS 'du
lynxoid

3
@lynxoid: È possibile installare la versione GNU con birra: brew install coreutils. Sarà disponibile come comando gdu.
neu242

1
Non funziona. ls-> file.gz hardlink-to-file.gz. stat -c %s file.gz-> 9657212. stat -c %s hardlink-to-file.gz-> 9657212. du -sb-> 9661308. Non è sicuramente la dimensione totale del contenuto, ma la dimensione che la directory occupa sul disco.
anton_rh

24

cd nella directory, quindi:

du -sh

ftw!

Ne ho scritto originariamente qui: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/


1
Questo è semplice e funziona! Grazie. A volte, mi piace aggiungere l' -Lopzione così dusegue i collegamenti simbolici.
conradkleinespel

2
funziona per me (su OS X)
sam boosalis

2
Questo è semplice e non funziona. Stampa lo spazio che la directory occupa sul disco, non la dimensione totale del contenuto che potrebbe essere calcolata aprendo ogni file e contando i byte.
anton_rh

17

Solo un'alternativa:

ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^d' escluderà le directory.


4
Perfetto, aggiungi anche il parametro -a per ottenere "file nascosti" (tutto ciò che inizia con un punto)
Nicholi

Isolato su un tipo di file specifico (in questo caso, PNG) ed espresso in MB per una maggiore leggibilità: ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
MusikPolice

È una risposta corretta. A differenza di duquesta soluzione conta davvero la dimensione totale di tutti i dati nei file come se fossero aperti uno per uno e se ne contassero i byte. Ma sì, l'aggiunta del -Aparametro è necessaria per contare anche i file nascosti.
anton_rh

13

Il formato "% s" di stat ti fornisce il numero effettivo di byte in un file.

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

Sentiti libero di sostituire il tuo metodo preferito per sommare i numeri .


4
Utilizzare preferibilmente "find. -Type f -print0 | xargs -0 ..." per evitare problemi con certi nomi di file (contenenti spazi, ecc.).
hlovdal

1
sì, buon punto. se non fosse in bsd 4.2 non ricordo di usarlo :-(
Nelson

3
find -print0e xargs -0sono necessari per i nomi di file con spazi. OS X vuole stat -f %z.
Kornel

1
(Si noti che stat funziona con file sparsi, riportando la grande dimensione nominale del file e non i blocchi più piccoli utilizzati su durapporti simili a dischi .)
Nelson

1
A differenza di molte altre risposte qui che utilizzano erroneamente l' duutilità, questa risposta è corretta. È molto simile alla risposta qui: unix.stackexchange.com/a/471061/152606 . Ma io userei ! -type dinvece di -type fcontare anche i collegamenti simbolici (la dimensione del collegamento simbolico stesso (di solito pochi byte), non la dimensione del file a cui punta).
anton_rh

3

Se usi "du" di busybox in un sistema incorporato, non puoi ottenere un byte esatto con du, solo Kbytes puoi ottenere.

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.

Options:
        -a      Show sizes of files in addition to directories
        -H      Follow symbolic links that are FILE command line args
        -L      Follow all symbolic links encountered
        -d N    Limit output to directories (and files with -a) of depth < N
        -c      Output a grand total
        -l      Count sizes many times if hard linked
        -s      Display only a total for each argument
        -x      Skip directories on different filesystems
        -h      Print sizes in human readable format (e.g., 1K 243M 2G )
        -m      Print sizes in megabytes
        -k      Print sizes in kilobytes(default)

3

Quando viene creata una cartella, molti filesystem Linux allocano 4096 byte per memorizzare alcuni metadati sulla directory stessa. Questo spazio aumenta di un multiplo di 4096 byte man mano che la directory cresce.

Il comando du (con o senza l'opzione -b) tiene conto di questo spazio , come puoi vedere digitando:

mkdir test && du -b test

avrai un risultato di 4096 byte per una directory vuota. Quindi, se metti 2 file di 10000 byte nella directory, l'importo totale dato da du -sb sarebbe 24096 byte.

Se leggi attentamente la domanda, questo non è ciò che ti è stato chiesto. L'interrogante ha chiesto:

la somma totale di tutti i dati in file e sottodirectory che otterrei se aprissi ogni file e contassi i byte

quello nell'esempio sopra dovrebbe essere 20000 byte, non 24096.

Quindi, la risposta corretta IMHO potrebbe essere una miscela di risposta di Nelson e suggerimento hlovdal per gestire nomi di file contenenti spazi:

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'

2

Ci sono almeno tre modi per ottenere la "somma totale di tutti i dati in file e sottodirectory" in byte che funzionano sia in Linux / Unix che in Git Bash per Windows, elencati di seguito in ordine dal più veloce al più lento in media. Per tuo riferimento, sono stati eseguiti alla radice di un file system abbastanza profondo ( docrootin un'installazione di Magento 2 Enterprise comprendente 71.158 file in 30.027 directory).

1.

$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes

real    0m0.221s
user    0m0.068s
sys     0m0.160s

2.

$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes

real    0m0.256s
user    0m0.164s
sys     0m0.196s

3.

$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes

real    0m0.553s
user    0m0.308s
sys     0m0.416s


Anche questi due funzionano, ma si basano su comandi che non esistono su Git Bash per Windows:

1.

$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes

real    0m0.233s
user    0m0.116s
sys     0m0.176s

2.

$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes

real    0m0.242s
user    0m0.104s
sys     0m0.152s


Se desideri solo il totale per la directory corrente, aggiungi -maxdepth 1a find.


Nota che alcune delle soluzioni suggerite non restituiscono risultati accurati, quindi preferirei le soluzioni sopra.

$ du -sbh
832M    .

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525

$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471

$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133

1
Per quanto riguarda Git Bash per Windows, - nel caso di Cygwin, dcfa parte del bcpacchetto, quindi per ottenerlodc è necessario installarlo bc.
ruvim

1

Per Win32 DOS, puoi:

c:> dir / sc: \ directory \ you \ want

e la penultima riga ti dirà quanti byte occupano i file.

So che questo legge tutti i file e le directory, ma funziona più velocemente in alcune situazioni.


1

duè utile, ma findè utile nel caso in cui si desideri calcolare la dimensione solo di alcuni file (ad esempio, utilizzando il filtro per estensione). Notare inoltre che findessi stessi possono stampare la dimensione di ogni file in byte. Per calcolare una dimensione totale possiamo collegare il dccomando nel modo seguente:

find . -type f -printf "%s + " | dc -e0 -f- -ep

Qui findgenera una sequenza di comandi per dcsimili 123 + 456 + 11 +. Tuttavia, il programma completato dovrebbe essere come 0 123 + 456 + 11 + p(ricorda la notazione con suffisso).

Quindi, per ottenere il programma completo, dobbiamo metterlo 0in pila prima di eseguire la sequenza da stdin e stampare il numero in alto dopo l'esecuzione (il pcomando alla fine). Lo otteniamo tramite le dcopzioni:

  1. -e0è solo una scorciatoia per -e '0'quelle put0 in pila,
  2. -f-serve per leggere ed eseguire comandi da stdin (quello generato da findqui),
  3. -epè per stampare il risultato ( -e 'p').

Per stampare la dimensione in MiB come 284.06 MiBpossiamo usare -e '2 k 1024 / 1024 / n [ MiB] p'al punto 3 (la maggior parte degli spazi sono opzionali).


1

Questo può aiutare:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

Il comando precedente sommerà il totale di tutti i file che lasciano la dimensione delle directory.


1
Nota che questa soluzione è molto simile alla risposta di Barun. Ma questa soluzione non somma i file in sottodirectory.
ruvim

1
@ruvim, non somma anche i file nascosti. Per sommare i file nascosti, l' -Aopzione deve essere aggiunta a ls.
anton_rh

0

Uso:

$ du -ckx <DIR> | grep total | awk '{print $1}'

Dove <DIR> è la directory che desideri esaminare.

"-C" fornisce i dati del totale complessivo che vengono estratti utilizzando la parte "grep total" del comando e il conteggio in Kbyte viene estratto con il comando awk.

L'unico avvertimento qui è che se hai una sottodirectory contenente il testo "totale" verrà anche sputato.

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.