Come ottenere le dimensioni riepilogative delle directory e delle loro sottodirectory?


305

Diciamo che voglio ottenere le dimensioni di ogni directory di un file system Linux. Quando uso ls -lanon riesco davvero a ottenere le dimensioni riepilogative delle cartelle.

Se uso dfottengo le dimensioni di ciascun file system montato ma anche questo non mi aiuta. E con duottengo le dimensioni di ogni sottodirectory e il riepilogo dell'intero file system.

Ma voglio avere solo la dimensione riepilogativa di ciascuna directory all'interno della cartella ROOT del file system. C'è qualche comando per raggiungerlo?


La --totalbandiera mi è stata utile. Es du -sh --total applications/*. askubuntu.com/a/465436/48214
Ryan

Risposte:


429

Questo fa quello che stai cercando:

du -sh /*

Cosa significa:

  • -s per fornire solo il totale per ciascun argomento della riga di comando.
  • -hper suffissi leggibili dall'uomo come Mper i megabyte e Gper i gigabyte (facoltativo).
  • /*si espande semplicemente in tutte le directory (e file) in /.

    Nota: i dotfile non sono inclusi; correre shopt -s dotglobper includere anche quelli.

Utile anche l'ordinamento per dimensione:

du -sh /* | sort -h

Qui:

  • -hassicura che sortinterpreti correttamente i suffissi leggibili dall'uomo.

8
Se hai directory di punti nella directory principale, puoi usarle shopt -s dotglobper includerle nel conteggio.
Philipp,

8
È molto utile, perché è semplice e puoi posizionare il percorso che desideri invece /*, ad esempio ./per la directory corrente o ./*per ogni elemento nella directory corrente.
psur

3
@psur oppure puoi usare ./*/solo per ottenere sottocartelle e non tutti gli articoli
relascope

7
Versione ordinata:du -sh /* | sort -h
Vu Anh,

2
@ c1phr Se sortnon lo hai -h, devi anche lasciarlo fuori du, altrimenti lo smistamento confonderà chilo / mega / gigabyte. du -s /* | sort -nr.
Thomas,

78

Ho spesso bisogno di trovare le directory più grandi, quindi per ottenere un elenco ordinato contenente le 20 directory più grandi faccio questo:

du -m /some/path | sort -nr | head -n 20

In questo caso le dimensioni verranno riportate in megabyte.


11
Ecco un modo per renderlo più leggibile du -sh / some / path | ordina -hr | head -n 20
Xedecimal

6
@Xedecima il problema con l'utilizzo di h è che l'ordinamento non sa come gestire dimensioni diverse. Ad esempio, 268 K sono ordinati più in alto di 255 M ed entrambi sono ordinati in modo più alto di
2,7 G

4
L'argomento -h (leggibile dall'uomo) sul comando 'sort' dovrebbe leggere correttamente questi valori. Proprio come la bandiera di du-h li esporta. A seconda di cosa stai correndo, suppongo.
Xedecimal

Funziona in Ubuntu 16.04. Bel consiglio.
SDsolar

sudo du -haxt 1G / | ordina -hr | testa -30
deviante


11

Le risposte esistenti sono molto utili, forse alcuni principianti (come me) troveranno utile anche questo.

  1. Loop molto semplice, ma per me questo è stato un buon inizio per alcune altre operazioni relative alle dimensioni:

    for each in $(ls) ; do du -hs "$each" ; done
    
  2. Molto simile alla prima risposta e quasi allo stesso risultato di 1.), ma mi ci è voluto del tempo per capire la differenza di * a ./* se in una sottodirectory:

    du -sh ./*
    

for eachnon funziona poiché aggiunge i caratteri della console (ad esempio \033[) all'elenco delle cartelle
machineaddict

@machineaddict non è sicuro di cosa intendi. Lo uso sempre, funziona bene per me.
Martin,

prova a eseguire il comando a partire da for each. non funzionerà
machineaddict

ho eseguito il comando esattamente come scritto qui. a partire da ciascuno. lavori.
Martin

7

La seguente duchiamata dovrebbe funzionare sui sistemi BSD:

du -d 1 /

1
Il mio du(Ubuntu 10.4) non ha -dun'opzione. Su quale sistema sei?
Thomas,

Sul mio openSUSE non ha nemmeno un'opzione -d :(
2ndkauboy

OK, allora è solo un'opzione BSD (sono su OS X).
Philipp,

La giusta combinazione di opzioni portatili su BSD / * NIX è du -sk /*. Odio le -kcose davvero tanto. Linux è -htotalmente incredibile.
Dummy00001,

in altri sistemi, è--max-depth
Vishnu Kumar il

4

Questo non è facile Il ducomando mostra file e cartelle (impostazione predefinita) o solo le dimensioni di tutti gli elementi specificati nella riga di comando (opzione -s).

Per ottenere gli elementi più grandi (file e cartelle), ordinati, con dimensioni leggibili dall'uomo su Linux:

du -h | sort -h

Questo ti seppellirà in un sacco di piccoli file. Puoi sbarazzartene con --threshold(1 MB nel mio esempio):

du --threshold=1M -h | sort -h

Il vantaggio di questo comando è che include cartelle di punti nascosti (cartelle che iniziano con .).

Se vuoi davvero solo le cartelle, devi usarlo findma questo può essere molto, molto lento poiché dudovrà scansionare molte cartelle più volte:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h

1
--threshold ^^^ questa opzione non è disponibile su linux
podarok

1
@podarok È disponibile su OpenSUSE 13.2 Linux. Prova a trovare una versione più recente della tua distribuzione o compila tu stesso una versione più recente del pacchetto.
Aaron Digulla,

Non funziona su Ubuntu LTS (14.04). È il più recente))
podarok

@podarok Quale versione dei coreutils GNU? Il mio è 8,24.
Aaron Digulla,

1
La memorizzazione nella cache potrebbe essere stata un brutto termine. Stavo pensando a qualcosa di simile fatto in questa porta superuser.com/a/597173/121352 in cui scansioniamo i contenuti dei dischi una volta in una mappatura e poi continuiamo a usare i dati di quella mappatura anziché colpire di nuovo il disco.
Hennes,

1

Tieni presente che non puoi confrontare directory con dudiversi sistemi / macchine senza esserne sicuro, entrambi condividono la stessa dimensione di blocco del filesystem. Questo potrebbe contare se si risincronizzano alcuni file da una macchina Linux a un nas e si desidera confrontare la directory sincronizzata da soli. Potresti ottenere risultati diversi con a ducausa di diverse dimensioni di blocchi ....


0

Potresti anche voler dare un'occhiata a xdiskusage . Ti darà le stesse informazioni, ma mostrate graficamente, oltre a consentire il drill down (molto utile). Esistono altre utilità simili per KDE e persino per Windows.


0

È possibile utilizzare lsin combinazione con awk:

ls -al * | awk 'BEGIN {tot=0;} {tot = tot + $5;} END {printf ("%.2fMb\n",tot/1024/1024);}'

L'output di lsviene reindirizzato a awk. awkinizia l'elaborazione dei dati. Il delimitatore standard è spazio. La variabile somma totviene inizializzata su zero; la seguente istruzione viene eseguita per ogni riga / riga prodotta da ls. Aumenta semplicemente totcon la dimensione. $5sta per quinta colonna (prodotta da ls). Alla fine dividiamo per (1024 * 1024) per sommare in megabyte.

Se lo convertissi in uno script o in una funzione (.bashrc) puoi anche usarlo per ottenere la dimensione di alcuni sottoinsiemi di directory, secondo i tipi di file.

Se desideri informazioni a livello di sistema, kdirstatpotrebbero esserti utili!


Sono d'accordo che uno può espandere questo esempio e fare trucchi come ottenere la dimensione di "alcuni sottoinsiemi di directory, secondo i tipi di file" ecc .; può sembrare un buon punto di partenza. Tuttavia, questa soluzione è difettosa fin dall'inizio. A tutti gli utenti che desiderano utilizzare questo metodo, consiglio di leggere le risposte e i commenti a questa domanda , nonché l' articolo lì collegato . Non dico che non puoi farlo affatto. Conosci i limiti, tutto qui.
Kamil Maciorowski il
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.