Sortieren von lesbaren Dateigrößen

16

Wie kann ich eine Liste nach einer für Menschen lesbaren, numerischen Sortierung sortieren, bei der die Größenbezeichnung (G, M, K) berücksichtigt wird? Kann ich beispielsweise " du -sh" Ausgaben sortieren ?

Problem: Betrachten Sie das Problem, Dateien / Ordner aufzulisten und nach ihrer Größe zu sortieren. Sie können dies erreichen, indem Sie Folgendes ausführen:

du -s * | sort -n

Hier werden die Dateien / Ordner nach ihrer Größe sortiert aufgelistet. Der Wert für die gedruckte Größe wird jedoch in Byte (oder Megabyte oder Gigabyte, wenn Sie dies wünschen) angegeben.

Es wäre wünschenswert, in der Lage zu sein, anhand der für Menschen lesbaren Werte zu sortieren, damit ich etwas Analoges ausführen kann

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

Und 1,5 GB Ordner werden nach 2,0 MB angezeigt.

notnoop
quelle

Antworten:

29

Verwenden Sie GNU coreutils> = 7.5:

du -hs * | sort -h

(Entnommen aus dieser Serverfehlerfrage )

Manpage

Bearbeiten: Sie können Ihre Versionen mit du --versionund überprüfen, sort --versionob Sie die GNU-Versionen verwenden. Wenn Sie Homebrew verwenden, müssen Sie möglicherweise gduund verwenden gsort.

Jason Axelson
quelle
8
OSX hat diese Option nicht. Sie können homebrew to verwenden brew install coreutils(wobei allen coreutils-Befehlen ein 'g' vorangestellt wird). Sie können dann tun gdu -hs * | gsort -h.
Dsummersl
1
Nur um den Punkt von @ dsummersl zu verdeutlichen: Das du -hs *funktioniert gut unter Mac OS X, sort -hkehrt aber zurück sort: invalid option -- h. Man kann das Paket coreutils auch wie hier beschrieben über MacPorts installieren .
Jvriesem
3

Wenn Sie sich nur Gedanken über Dateien machen, die größer als 1 MB sind, können Sie sie mit diesem Befehl sortieren und awk verwenden, um die Größe in MB zu konvertieren:

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

Auch hierdurch werden die Größen auf die nächsten MB gerundet. Sie können die Umrechnung in die Einheit Ihrer Wahl ändern.

Patrick
quelle
Dies ist vergleichbar mit: du -sm * | sort -n. -sMit / werden -gdie duAusgabegrößen in Megabyte / Gigabyte angegeben.
4.
Für MB muss man noch durch 1024 dividieren. So wird es seinint($1 / (1024 * 1024))
Pratik Khadloya
2

Dieser behandelt Dateinamen mit Leerzeichen oder Apostrophen und funktioniert auf Systemen, die Folgendes nicht unterstützen xargs -doder sort -h:

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

was in ... endet:

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

Hier ist ein anderes:

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

Möglicherweise müssen Sie eine

$ cpan Number::Bytes::Human

zuerst.

0x89
quelle
1

du -sk * | sort -n | awk '{print $ 2}' | während f gelesen wird; do du -sh "$ f"; erledigt


quelle
1

Dieser Befehl wird nach Größe in MB sortiert

du --block-size=MiB --max-depth=1 path | sort -n
lukmansh
quelle
Das macht der User eigentlich schon, er / sie hat das Beispiel mit MiB einfach nicht gegeben, sondern erwähnt. Was er / sie sucht, ist zu sortieren, wenn er / sie die -hFlagge benutzt, um zu du.
Tonin
0

Ich bin hier gelandet, weil ich versucht habe, etwas anderes zu sortieren, das MB und GB in derselben Ausgabe kombiniert, und ich konnte es nicht kontrollieren.

$NFwird verwendet, da das Muster #GBoder #MBdie letzte Spalte in der Ausgabe war:

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

Erklärung des awk Befehls:

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

wenn die letzte Spalte mit dem regulären Ausdruck übereinstimmt, der .eine oder mehrere Ziffern enthält, gefolgt vonGB

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

Setzen Sie dann die Variable aauf den Ziffernteil jeder Zeile, der mit demselben Regex-Muster in derselben letzten Spalte übereinstimmt ( $NF).

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

aVerwenden Sie nach dem Einstellen , um printfdie Ausgabe als zu formatieren${a*1024}MB

else {print $NF}

Andernfalls drucken Sie einfach die letzte Spalte

sort -n

Verwenden Sie die numerische Sortierung für die Ausgabe


Beispiel

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

Ich bin mir sicher, dass es eine Möglichkeit gibt, das Regex-Muster wiederzuverwenden. Ich führe das Match also nur einmal durch und ersetze es an der richtigen Stelle, aber ich weiß noch nicht, wie ich das machen soll :)

Jens Bodal
quelle