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.
brew install coreutils
(wobei allen coreutils-Befehlen ein 'g' vorangestellt wird). Sie können dann tungdu -hs * | gsort -h
.du -hs *
funktioniert gut unter Mac OS X,sort -h
kehrt aber zurücksort: invalid option -- h
. Man kann das Paket coreutils auch wie hier beschrieben über MacPorts installieren .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:
Auch hierdurch werden die Größen auf die nächsten MB gerundet. Sie können die Umrechnung in die Einheit Ihrer Wahl ändern.
quelle
du -sm * | sort -n
.-s
Mit / werden-g
diedu
Ausgabegrößen in Megabyte / Gigabyte angegeben.int($1 / (1024 * 1024))
Dieser behandelt Dateinamen mit Leerzeichen oder Apostrophen und funktioniert auf Systemen, die Folgendes nicht unterstützen
xargs -d
odersort -h
:was in ... endet:
quelle
Hier ist ein anderes:
Möglicherweise müssen Sie eine
zuerst.
quelle
du -sk * | sort -n | awk '{print $ 2}' | während f gelesen wird; do du -sh "$ f"; erledigt
quelle
Dieser Befehl wird nach Größe in MB sortiert
quelle
-h
Flagge benutzt, um zu du.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.
$NF
wird verwendet, da das Muster#GB
oder#MB
die letzte Spalte in der Ausgabe war: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
a
auf den Ziffernteil jeder Zeile, der mit demselben Regex-Muster in derselben letzten Spalte übereinstimmt ($NF
).printf "%sMB\n", a*1024} \
a
Verwenden Sie nach dem Einstellen , umprintf
die 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
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 :)
quelle