Questa domanda ha già una risposta qui:
Quale comando devo usare per trovare (in modo ricorsivo) la dimensione di tutti i file in una directory Linux o Mac OS X?
Questa domanda ha già una risposta qui:
Quale comando devo usare per trovare (in modo ricorsivo) la dimensione di tutti i file in una directory Linux o Mac OS X?
Risposte:
La versione BSD du
utilizzata in OS X riporta le dimensioni con blocchi da 512 byte - le dimensioni sono essenzialmente arrotondate al successivo valore di 512 byte. Questo ti dice lo spazio sul disco, che è maggiore della quantità di dati. Se hai molti file di piccole dimensioni, la differenza può essere grande.
Ecco un esempio
Questo è il valore con regolare du
. È in blocchi da 512 byte:
$ du -s
248 .
Il -h
flag si traduce in un numero più leggibile, in kilobyte. Come previsto, è la metà del numero di blocchi da 512 byte:
$ du -hs
124K .
Infine, puoi usare find
e awk
darti la somma dei byte effettivi nei file. Questo è un po 'lento, ma funziona:
$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527
Questo valore corrisponde esattamente al numero riportato dalla finestra Ottieni informazioni del Finder. (Non ci sono strani fork o xattrs in questo set di file.) È significativamente più piccolo del valore riportato da du
.
Ecco come funziona: ottiene un elenco di tutti i file e li passa a ls -l
; quindi awk
viene utilizzato per contare i byte. Il -type f
flag è lì in modo che vengano inviati solo i file (e non le directory) ls
. Senza quel flag, invierà anche i nomi delle directory ls
e ogni file verrà elencato due volte: una volta come singolo file e una volta come elemento nella directory.
La versione GNU di du
può fornire valori in byte effettivi anziché in blocchi. È un peccato che la versione di BSD du
non sia così flessibile.
du
da coreutils GNU con l' -b
opzione ottengo un risultato diverso rispetto alla tua find
pipe. Per una directory da 36 GB ottengo una differenza di 82 KB.
Mostra le dimensioni di un singolo file
du -h path_to_a_file
Mostra la dimensione del contenuto di una directory, di ogni sottodirectory e di ogni singolo file:
du -h path_to_a_directory
Mostra la dimensione del contenuto di una directory:
du -sh path_to_a_directory
du -sch
se vuoi qualcosa di più facilmente leggibile.
du - indica all'utilizzo del disco non la dimensione del file .
find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'
sopra il codice terminale (im su osx 10.6) mi offre il miglior risultato ed è più veloce di "find ... -exec"
un rapido riferimento
time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970
real 0m0.086s
user 0m0.029s
sys 0m0.073s
time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970
real 0m18.515s
user 0m2.929s
sys 0m9.339s
find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
È possibile utilizzare in du -ah .
modo ricorsivo le dimensioni di tutti i file e directory visualizzate.
Questo può essere combinato con sort
, quindi vedrai le prime 20 directory più grandi nella cartella corrente:
du -ah . | sort -rh | head -20
Nota: l'opzione -h
per sort
non è disponibile su OSX / BSD, quindi è necessario installare sort
da coreutils
(ad es. Via brew
) e applicare il percorso bin a PATH
, ad es.
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.
Altrimenti usa:
du -a . | sort -rn | head -20
brew install coreutils
altrimenti usa il comando di ordinamento BSD alla fine senza -h
.
Ho combinato tutti i tuoi approcci e l'ho combinato con un output leggibile dall'uomo il risultato è:
#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'
Link alla sintesi: https://gist.github.com/mlegenhausen/9365461
-k
opzione per usare la dimensione del blocco di 1K byte