Trova i file o le directory più grandi


10

Quale comando stampa le dimensioni di tutti i file e le directory nella directory tmp (comprese quelle nascoste) e le ordina per dimensioni dal più grande al più piccolo in formato leggibile dall'uomo (ad es. 2 GB)?

L'output potrebbe essere il seguente:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

Ho provato a usare i comandi lse duma non sono riuscito a trovare gli interruttori giusti.

Risposte:


7

Ecco una soluzione rapida, usa du + sort. Prova questo:

du -smc * | sort -n

Ciò ignorerà i file nascosti, ma questa è un'altra soluzione semplice:

du -smc .[^.] .??* * | sort -n

Ciò può causare avvisi se uno o più dei modelli sopra indicati non corrispondono a un file. Il primo modello .[^.]corrisponde a tutti e due i nomi dei file dei caratteri che iniziano con. fatta eccezione per .., il secondo modello, .??*corrisponde a tutte e tre le lettere o più nomi di file che iniziano con. e * corrisponde a tutti i file che non iniziano con. Per un elenco più sofisticato come trovare tutti i file più grandi di X in un intero file system o mantenere un elenco di crescita del filesystem, ho alcuni script shell fai-da-te che ho scritto e posso condividere se sei interessato.


Grazie. Sono interessato alla tua sceneggiatura se sarai così gentile.
xralf,

1
Utilizzare sort -nrse si desidera visualizzare i valori più alti.
LawrenceC,

3

Per elencare i file ovunque sotto /tmp, ordinati per dimensione:

find /tmp -type f -exec du -k {} + | sort -k1n -k2

Per elencare i file e gli alberi delle directory immediatamente sotto /tmp, ordinati per dimensione:

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

Per elencare tutti i file e gli alberi delle directory ovunque /tmp, ordinati per dimensione:

du -ak /tmp | sort -k1n -k2

(Un esempio per illustrare la differenza tra i tre comandi: se c'è un file /tmp/dir/file, il primo elenco di comandi /tmp/dir/file, il secondo elenco /tmp/dire il terzo elenco entrambi).

Tutti i comandi sopra mostrano le dimensioni in kilobyte. Mentre GNU du può produrre dimensioni "leggibili dall'uomo" (con moltiplicatori k, M, G, ecc.), Ordinarle è un'altra cosa. Coreutils GNU abbastanza recenti (≥7,4) possono farlo: basta sostituire du -kcon du -he sort -k1n -k2con sort -k1h -k2. Altrimenti, ecco uno script awk grezzo da convertire in dimensioni suffissate (arrotondamento per difetto); sortinserisci semplicemente l' output sopra.

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'

Grazie. Questi comandi sono utili, ma sono interessato solo ai file e alle directory direttamente in tmp, non ai file nelle sottodirectory
xralf

1
@xralf: utilizzare quindi solo il secondo modulo di duchiamata.
Gilles 'SO- smetti di essere malvagio' il

Sembra buono, ma il risultato migliore è con MB e GB pubblicati come forcefsck.
xralf,

3

Sto usando il seguente alias per questo: alias ds='du -x --all --max-depth=1 . | sort -n'

Stampa le dimensioni di tutti i file e le sottodirectory di livello 1 della directory corrente.


È una bella soluzione breve, ma stampa solo directory.
Xralf,

Oh, scusa, hai ragione. Non ho mai affrontato questo problema con i file. Tuttavia, ho scoperto come farlo funzionare con i file: usando --all swicth.
camper

Ottima soluzione corretta. penguin359 ha leggermente meglio perché mostra le dimensioni in MB. La migliore sarebbe la soluzione di forcefsck, ma la sua soluzione omette le directory con spazi.
xralf,

1

Con l'attuale versione di gnu sort (e prendendo in prestito il modello di file @ penguin359)

cd /tmp; du -sShc .[^.] .??* * | sort -h

Con una versione precedente di sorta

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

EDIT: aggiunto il parametro -Sdu per non includere le sottodirectory.


Volevo piuttosto spazio su disco utilizzato da file e directory (dimensione totale dei dati all'interno) direttamente sotto tmp (non sottodirectory). Il mio comando di ordinamento non ha l'opzione -h.
xralf,

Non sono sicuro al 100% di cosa intendi, dal momento che hai già accettato una risposta con la stessa selezione di pattern di file. Ho modificato il mio post per non includere i sottodir. Se si desidera la dimensione apparente e non lo spazio su disco effettivo utilizzato, è possibile aggiungere --apparent-sizea du parametri.
forcefsck

Ora funziona bene. Devo solo cercare GB e poi MB, ma non è un problema.
xralf,

Avevo le lettere dell'unità nell'ordine sbagliato, ora riparate. Se vuoi che l'ordine sia grande o piccolo, cambia l'ordine delle lettere unitarie e aggiungi -r per ordinare.
forcefsck

Ho notato che si è dimenticato di stampare la dimensione della directory (senza prefisso)
xralf

0

AGGIORNAMENTO: ho eliminato lo script precedente. Ecco una nuova versione, usando due awk (quella precedente usata treee sed)

Questo è l'output di: dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

Ecco la sceneggiatura

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#

Quando dici dimensioni di tutti i file e directory , intendi lo spazio che ogni elemento occupa sul disco (es. Sul mio filesystem Ubuntu ext4 , una directory vuota occupa 4k di spazio su disco e un file più piccolo di 4k occupa 4k Il blocco minimo di assegnazione è 4k) .. o vuoi dire la quantità di dati in ciascun file, ad esempio 100 (byte) .. E per le directory, vuoi sapere il totale dei dati del file in quella directory .. Se vuoi la dimensione dei dati all'interno dei file, quindi lo treefa. se vuoi usare lo spazio su disco, allora du... ( treenon totalizza una directory)
Peter.O

'du' è la scelta migliore ... Ho appena notato man du, che può anche riportare la "dimensione del file apparente" .... The apparent size of a file is the number of bytes reported by wc -c 'su file regolari, o più in generale, ls -l --block-size=1' or stat --format =% S'. Ad esempio, un file contenente la parolazoo' with no newline would, of course, have an apparent size of 3.
Peter.O

Volevo piuttosto spazio su disco utilizzato da file e directory (dimensione totale dei dati all'interno) direttamente sotto tmp (non sottodirectory)
xralf

Mi dispiace, non sono ancora nella fase di shell scripting che potrei ancora capirlo, quindi ho lasciato agli altri utenti la possibilità di decidere quanto sia buona la risposta. Grazie per il tuo lavoro. Lo studierò quando sto meglio.
xralf,

0
find /tmp -exec du {} + | sort -nr | less 

mostra prima i file più grandi, quindi puoi qusarli non appena hai visto abbastanza.

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.