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.