Ordinamento delle dimensioni dei file leggibili dall'uomo


16

Come posso ordinare un elenco usando un ordinamento di dimensioni file leggibile dall'uomo, ordinamento numerico che tenga conto dell'identificatore di dimensione (G, M, K)? Posso ordinare " du -sh" l'output per esempio?

Problema: considerare il problema di elencare file / cartelle e ordinarli in base alle loro dimensioni. Puoi farlo eseguendo:

du -s * | sort -n

Questo elenca i file / cartelle ordinati in base alle loro dimensioni. Tuttavia, il valore della dimensione stampata è in byte (o megabyte o gigabyte se si sceglie).

Sarebbe desiderabile poter ordinare in base ai valori leggibili dall'uomo, in modo da poter eseguire qualcosa di analogo a

du -sh * | <human-readable file sort>

E la cartella da 1,5 GB viene visualizzata dopo 2.0M.

Risposte:



29

Usa coreutils GNU> = 7.5:

du -hs * | ordina -h

(Tratto da questa domanda serverfault )

Pagina man

Modifica: puoi controllare le tue versioni usando du --versione sort --versionse stai usando le versioni GNU. Se stai usando l'homebrew potresti dover usare gdue gsort.


8
OSX non ha questa opzione. Puoi usare homebrew su brew install coreutils(che antepone tutti i comandi coreutils con una 'g'). Quindi puoi farlo gdu -hs * | gsort -h.
dsummersl,

1
Giusto per chiarire il punto di @dsummersl: du -hs *funziona bene su Mac OS X, ma sort -hritorna sort: invalid option -- h. Si può anche installare il pacchetto coreutils tramite MacPorts come descritto qui .
jvriesem,

3

Se sei solo preoccupato per i file più grandi di 1 MB, come sembra, puoi usare questo comando per ordinarli e usare awk per convertire le dimensioni in MB:

du -s * | sort -n | awk '{print int($1 / 1024)"M\t"$2}'

Ancora una volta, questo arrotonda le dimensioni al MB più vicino. Puoi modificarlo convertendolo nell'unità di tua scelta.


Questo è simile a: du -sm * | sort -n. -s/ -grende dule dimensioni di output in megabyte / gigabyte.
notnoop,

Per MB devi dividere per 1024 in più. Così saràint($1 / (1024 * 1024))
Pratik Khadloya, il

2

Questo gestisce i nomi di file con spazi bianchi o apostrofi e funziona su sistemi che non supportano xargs -do sort -h:

du -s * | sort -n | cut -f2 | tr '\n' '\0' | xargs -0 -I {} du -sh "{}"

che si traduce in:

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm

1

Eccone un altro:

$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'

Potrebbe essere necessario fare un

$ cpan Number::Bytes::Human

primo.


1

du -sk * | ordina -n | awk '{print $ 2}' | mentre leggi f; do du -sh "$ f"; fatto


1

Questo comando ordinerà per dimensione in MB

du --block-size=MiB --max-depth=1 path | sort -n

Questo è già ciò che l'utente sta effettivamente facendo, semplicemente non ha dato l'esempio con MiB ma ne ha parlato. Quello che sta cercando è essere in grado di ordinare quando si usa la -hbandiera per du.
Tonin

0

Sono finito qui perché stavo cercando di ordinare qualcos'altro che combinasse MB e GB nello stesso output e non riuscivo a controllarlo.

$NFviene utilizzato poiché il modello #GBo #MBera l'ultima colonna nell'output:

somecommand | \
gawk '{
  if ($NF ~ /[0-9\.]+GB/) 
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF} 
}' | \
sort -n

Spiegazione del comando awk:

if ($NF ~ /[0-9\.]+GB/)

se l'ultima colonna corrisponde al modello regex che contiene una cifra o una .o più volte seguita daGB

{ a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \

quindi imposta la variabile asulla porzione delle cifre di ogni riga che corrisponde allo stesso schema regex nell'ultima colonna ( $NF)

printf "%sMB\n", a*1024} \

dopo l'impostazione a, utilizzare printfper formattare l'output come${a*1024}MB

else {print $NF}

altrimenti stampa solo l'ultima colonna

sort -n

usa l'ordinamento numerico sull'output


esempio

echo "4MB\n5GB\n420MB\n420GB\n1024MB\n1GB" | \                                                                                                                                 23:43:06 (EMP-2653/package-upgrades) Ø M
gawk '{
  if ($NF ~ /[0-9\.]+GB/)
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF}
}' | \
sort -n

Sono sicuro che c'è un modo per riutilizzare il modello regex, quindi eseguo la partita una sola volta e la sostituisco sul posto, ma non so ancora come farlo :)

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.