Come posso ottenere le dimensioni di una directory Linux o Mac OS X dalla riga di comando? [duplicare]


74

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?


2
puoi usare l' -kopzione per usare la dimensione del blocco di 1K byte
Zoker

Voglio solo raccomandare questo software gratuito chiamato Disk Inventory X. scaricalo qui derlien.com è semplice da usare per mac osx
Nimitack

Invece di du, io uso ncdu, puoi trovare il riferimento qui, remysharp.com/2018/08/23/cli-improved
Alan Dong

Risposte:


82

La versione BSD duutilizzata 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 -hflag 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 finde awkdarti 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 awkviene utilizzato per contare i byte. Il -type fflag è lì in modo che vengano inviati solo i file (e non le directory) ls. Senza quel flag, invierà anche i nomi delle directory lse ogni file verrà elencato due volte: una volta come singolo file e una volta come elemento nella directory.

La versione GNU di dupuò fornire valori in byte effettivi anziché in blocchi. È un peccato che la versione di BSD dunon sia così flessibile.


Ottima spiegazione È interessante notare che quando si utilizza duda coreutils GNU con l' -bopzione ottengo un risultato diverso rispetto alla tua findpipe. Per una directory da 36 GB ottengo una differenza di 82 KB.
Stefan Schmidt,

c'è un modo per stamparlo in un formato più leggibile dall'uomo?
anon58192932

75

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


25
du -schse vuoi qualcosa di più facilmente leggibile.
Joey,

@Johannes, suppongo che dovresti pubblicare questo commento come risposta, in modo che possa essere accettato?
Arjan,

Trovo ridondante l'opzione -c (almeno su Mac OS X) e du -sh sopprime i totali parziali.
Daryl Spitzer,

Ah, non sapevo che si potesse accettare la propria risposta. Ora almeno le persone sanno che la domanda è risolta.
Arjan,

Accetterò felicemente una nuova risposta che è un miglioramento per me.
Daryl Spitzer,

9

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

Se vuoi fare lo stesso su Ubuntu:find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
Rodrigo Polo,

c'è un modo per ottenere questo risultato in un formato leggibile dall'uomo?
anon58192932

6

È 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 -hper sortnon è disponibile su OSX / BSD, quindi è necessario installare sortda 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

Il primo comando non funziona su macOS 10.12.1 #du -ah. | ordina -rh | head -20 sort: opzione non valida - h Prova `sort --help 'per maggiori informazioni.
nucleartux,

3
@nucleartux Controlla la nota sotto il comando. Funziona nell'ordinamento GNU che puoi installare su macOS tramite:, brew install coreutilsaltrimenti usa il comando di ordinamento BSD alla fine senza -h.
Kenorb,

2

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

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.