it-swarm-eu.dev

Come posso ottenere la dimensione di una directory Linux o Mac OS X dalla riga di comando?

Quale comando devo utilizzare per trovare la dimensione di tutti i file (in modo ricorsivo) in una directory Linux o Mac OS X?

70
Daryl Spitzer

La versione BSD di du utilizzata nelle dimensioni dei report di OS X con blocchi da 512 byte - le dimensioni sono essenzialmente arrotondate al valore successivo di 512 byte. Questo ti dice lo spazio sul disco, che è più grande della quantità di dati. Se hai un sacco di piccoli file, la differenza può essere grande.

Ecco un esempio.

Questo è il valore con du regolare. È in blocchi da 512 byte:

$ du -s
248   .

Il flag -h restituisce 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 per 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 bizzarri forks o xattr 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; allora awk è usato per contare i byte. Il flag -type f è lì in modo che solo i file (e non le directory) vengano inviati a ls. Senza questo flag, invierà anche i nomi delle directory a ls, e ogni file verrà elencato due volte: una volta come singolo file e una volta come un elemento nella directory.

La versione GNU di du può dare valori in byte effettivi anziché in blocchi. È un peccato che la versione BSD di du non sia così flessibile.

79
wch

Mostra la dimensione di un singolo file

du -h path_to_a_file

Mostra le dimensioni del contenuto di una directory, di ciascuna 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

75
Daryl Spitzer

du - indica a disk use non il 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) offre per me il miglior risultato ed è mooolto più veloce di "find ... -exec"

un rapido punto di 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
9
Acid

È possibile utilizzare du -ah . che visualizza in modo ricorsivo le dimensioni di tutti i file e le directory.

Questo può essere combinato con sort, quindi vedrai le 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 devi installare sort da coreutils (ad esempio tramite 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
5
kenorb

Ho combinato tutti i tuoi approvi e 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 al Gist: https://Gist.github.com/mlegenhausen/9365461

2
malte