Come elencare la dimensione di ogni file e directory e ordinare in base alla dimensione decrescente in Bash?


108

Ho scoperto che non è facile ottenere la dimensione di una directory in Bash?

Voglio che quando digito ls -<some options>, possa elencare tutta la somma della dimensione del file della directory in modo ricorsivo e dei file allo stesso tempo e ordinare per ordine di dimensione.

È possibile?


2
Cosa intendi esattamente per "dimensione" di una directory? Il numero di file sotto di esso (ricorsivamente o no)? La somma delle dimensioni dei file sotto di essa (ricorsivamente o no)? La dimensione del disco della directory stessa? (Una directory è implementata come un file speciale contenente nomi di file e altre informazioni.)
Keith Thompson

dovrebbe essere La somma delle dimensioni dei file sotto di essa in modo ricorsivo
Kit Ho

1
@Kit: Allora duè la risposta.
Keith Thompson

Il ducomando @KeithThompson @KitHo stima l'utilizzo dello spazio per i file, quindi non è possibile utilizzarlo se si desidera ottenere la dimensione esatta.
ztank1013

@ ztank1013: A seconda di cosa intendi per "la dimensione esatta", du(almeno la versione GNU coreutils) probabilmente ha un'opzione per fornire le informazioni.
Keith Thompson

Risposte:


218

Basta accedere alla directory ed eseguire il seguente comando:

du -a --max-depth=1 | sort -n

OPPURE aggiungi -h per dimensioni leggibili dall'uomo e -r per stampare prima directory / file più grandi.

du -a -h --max-depth=1 | sort -hr

23
du -hrichiede sort -hanche, per garantire che, diciamo 981Mprima 1.3G; con sort -nsolo i numeri sarebbero stati presi in considerazione e sarebbero stati il ​​modo sbagliato.
Smylers

Questo non elenca la dimensione dei singoli file all'interno della directory corrente, solo la dimensione delle sue sottodirectory e la dimensione totale della directory corrente. Come includeresti anche i singoli file nell'output (per rispondere alla domanda di OP)?
Erik Trautman

@ErikTrautman per elencare anche i file che devi aggiungere -ae utilizzare --allinvece di --max-depth=1cosìdu -a -h --all | sort -h
Franco

Eccezionale! Faccio qualcosa di peggio da alcuni anni ormai. :)
Colby Blair

6
sort -hfunziona solo sulla versione GNU / Linux, senza fortuna con BSD / OS X.
djule5

20

Apparentemente l' --max-depthopzione non è nella versione di Mac OS X del ducomando. Puoi invece usare quanto segue.

du -h -d 1 | sort -n


Apparentemente, ma non sorprendentemente.
Josh Habdas

20
du -s -- * | sort -n

(questo non mostrerà i file nascosti (.dotfiles))

Uso du -smper unità Mb, ecc. Io uso sempre

du -smc -- * | sort -n

perché la riga totale ( -c) finirà in fondo per ovvi motivi :)

PS:

  • Vedere i commenti per la gestione dei dotfile
  • Uso spesso ad esempio 'du -smc / home / / | ordinare -n | tail 'per avere un'idea di dove si trovano esattamente i pezzi grandi

5
du --max-depth=1|sort -no find . -mindepth 1 -maxdepth 1|xargs du -s|sort -nper includere anche i dotfile.
Arnaud Le Blanc

@arnoud: lo uso anch'io, ma non mi è sembrata l'aggiunta giusta per questa domanda (/ risposta) :)
sehe

@ arnaud576875 find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -nse alcuni dei percorsi trovati potrebbero contenere spazi.
Lri

1
Questa è un'ottima variante per ottenere una visione leggibile dall'uomo del più grande:sudo du -smch * | sort -h | tail
marsbard

16

Comando

du -h --max-depth=0 * | sort -hr

Produzione

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

Spiegazione

  • du mostra "utilizzo del disco"
  • h sta per "leggibile dall'uomo" (sia, in sort che in du)
  • max-depth=0significa duche non mostrerà le dimensioni delle sottocartelle (rimuovila se vuoi mostrare tutte le dimensioni di ogni file in ogni sotto-, sotto-sotto-, ..., cartella)
  • r sta per "reverse" (prima il file più grande)

ncdu

Quando sono arrivato a questa domanda, volevo ripulire il mio file system. Lo strumento della riga di comando ncduè molto più adatto a questa attività.

Installazione su Ubuntu:

$ sudo apt-get install ncdu

Uso:

Basta digitare ncdu [path]nella riga di comando. Dopo alcuni secondi per analizzare il percorso, vedrai qualcosa del genere:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

Elimina l'elemento attualmente evidenziato con d, esci con CTRL+c


Puoi anche scrivere du -hs * | sort -hr. -s (riassumere) è uguale a --max-depth = 0
rasmusx

5

ls -Sordina per dimensione. Quindi, per mostrare anche la dimensione, ls -lSfornisce una visualizzazione lunga ( -l), ordinata per dimensione ( -S). Di solito aggiungo -hanche io , per rendere le cose più facili da leggere, quindi ls -lhS,.


1
Ah, scusa, non era chiaro dal tuo post. Vuoi du, sembra che qualcuno l'abbia pubblicato. @sehe: dipende dalla tua definizione di reale: mostra la quantità di spazio che la directory sta utilizzando per archiviarsi. (Semplicemente non aggiunge anche la dimensione delle voci secondarie.) Non è un numero casuale e non è sempre 4KiB.
Thanatos

1

Semplice e veloce:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* richiede GNU Parallel .


0

Penso di aver capito cosa vuoi fare. Questo darà un elenco ordinato di tutti i file e di tutte le directory, ordinati per dimensione del file e dimensione del contenuto nelle directory.

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n

Non importa, ha presentato una soluzione molto più semplice. Imparo qualcosa di nuovo ogni giorno!
dvorak

Non penso che l'uso dusia un'opzione, ti darà solo un risultato approssimativo.
ztank1013

0

[versione avanzata]
Questa sarà molto più veloce e precisa della versione iniziale di seguito e produrrà la somma di tutte le dimensioni del file della directory corrente:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

il stat -c %scomando su un file restituirà la sua dimensione in byte. Il trcomando qui viene utilizzato per superare i xargslimiti del comando (apparentemente xargsil collegamento a sta dividendo i risultati su più righe, rompendo la logica del mio comando). Quindi si trsta occupando di sostituire l'avanzamento riga con il +segno (più). sedha l'unico obiettivo di rimuovere l'ultimo +segno dalla stringa risultante per evitare lamentele dal bccomando finale (calcolatrice di base) che, come al solito, fa i conti.

Prestazioni: l' ho testato su diverse directory e oltre ~ 150.000 file in alto (il numero attuale di file della mia fedora 15 box) ottenendo quello che credo sia un risultato sorprendente:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

Nel caso in cui desideri fare un confronto con il du -sb /comando, verrà visualizzato un utilizzo stimato del disco in byte ( -bopzione)

# du -sb /
12684646920 /

Come mi aspettavo, è un po 'più grande del calcolo del mio comando perché l' duutilità restituisce lo spazio allocato di ogni file e non lo spazio effettivamente consumato.

[versione iniziale]
Non puoi usare il ducomando se hai bisogno di conoscere l'esatta dimensione della somma della tua cartella perché (come da citazione della pagina man)du stima l'utilizzo dello spazio file. Quindi ti porterà a un risultato sbagliato, un'approssimazione (forse vicino alla dimensione della somma ma molto probabilmente maggiore della dimensione effettiva che stai cercando).

Penso che potrebbero esserci diversi modi per rispondere alla tua domanda, ma questa è la mia:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

Trova tutti i file in. directory (cambia. con qualsiasi directory tu voglia), vengono inclusi anche i file nascosti e (usando xargs) ne restituisce i nomi in una singola riga, quindi produce un elenco dettagliato usando ls -l. Questo (a volte) enorme output viene convogliato verso il comando di taglio e solo il quinto campo ( -f5), che è la dimensione del file in byte, viene preso e nuovamente reindirizzato contro il xargsquale produce di nuovo una singola riga di dimensioni separate da spazi. Ora ha luogo una magia sed che sostituisce ogni spazio vuoto con un +segno più ( ) e infine bc(calcolatrice di base) fa i conti.

Potrebbe richiedere un'ulteriore ottimizzazione e potresti avere un lscomando che si lamenta dell'elenco degli argomenti troppo lungo.


se la directory è troppo grande, si blocca a lungo, prova a lavorare sulla tua directory home: p
Kit Ho

@KitHo beh, temo che non ci sia un modo facile e veloce per ottenere un risultato preciso senza cercare ogni singolo file e aggiungerne le dimensioni, quindi la pigrizia dei comandi dipende principalmente da quanti file ci sono sotto la directory cercata ... Ma ci credo è margine di miglioramento ... bella sfida!
ztank1013

@KitHo ehi, dai un'occhiata alla versione migliorata nella mia risposta ... e fammi sapere ovviamente!
ztank1013

0

Un'altra semplice soluzione.

$ for entry in $(ls); do du -s "$entry"; done | sort -n

il risultato sarà simile

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

cambiare "du -s" in "du -sh" mostrerà la dimensione leggibile dall'uomo, ma non saremo in grado di ordinare con questo metodo.


0

puoi usare quanto segue per elencare i file per dimensione du -h | sort -hr | più o du -h --max-depth = 0 * | sort -hr | Di Più


0

Tendo a usare du in modo semplice.

du -sh */ | sort -n

Questo mi fornisce un'idea di quali directory stanno occupando più spazio. Posso quindi eseguire ricerche più precise in seguito.


Questo tipo di lavoro, ma ignora le unità sulla dimensione del file durante l'ordinamento.
Benjamin Engwall
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.