Wie sortiere ich numerisch nach lesbaren Größen?


20

Zum Beispiel habe ich einen Befehl, der anzeigt, wie viel Speicherplatz ein Ordner benötigt

du folder | sort -n

Es funktioniert gut, aber ich hätte gerne eine lesbare Form

du -h folder

Wenn ich das tue, kann ich es jedoch nicht als numerisch sortieren.

Wie man beitritt du folderund du -h folderdie Ausgabe sortiert sieht du folder, aber mit der ersten Spalte vondu -h folder

PS das ist nur ein Beispiel. Diese Technik könnte für mich sehr nützlich sein (wenn es möglich ist)

Antworten:


11

Hier ist ein allgemeinerer Ansatz. Holen Sie sich die Ausgabe von du folderund du -h folderin zwei verschiedenen Dateien.

du folder > file1
du -h folder > file2

Der wichtigste Teil ist: verketten file1und file2zeilenweise mit einem geeigneten Trennzeichen.

paste -d '#' file1 file2 > file3

(vorausgesetzt #es erscheint nicht in file1und file2)

Jetzt sortieren file3. Beachten Sie, dass dies nach file1Inhalten sortiert wird und die Verknüpfungen nach file2Inhalten getrennt werden. Extrahieren Sie das relevante Ergebnis mit cut:

sort -n -k1,7 file3 | cut -d '#' -f 2

Schauen Sie sich auch man sortandere Optionen an.


Sie können dies auch als Alias ​​für eine spätere Wiederverwendung speichern. Fügen Sie dazu am Ende von Folgendes hinzu ~/.bashrc:

sorted-du () {
    paste -d '#' <( du "$1" ) <( du -h "$1" ) | sort -n -k1,7 | cut -d '#' -f 2
}

Öffnen Sie dann eine neue Terminalsitzung und führen Sie Ihren neuen Alias ​​aus:

sorted-du /home

Ich habe den letzten Teil hinzugefügt, wie Sie Ihre Lösung in einen Alias ​​umwandeln können.
SirCharlo

1
Die Verwendung tatsächlicher Dateien in einem Alias ​​(und der anschließende Aufruf von rm) ist eine wirklich sehr schlechte Idee ! Überlegen Sie, was passieren würde, wenn ich tatsächlich eine Datei file3in meinem Verzeichnis hätte, die überschrieben und dann gelöscht würde! @ SirCharlo Ich entferne die Alias-Definition aus dieser Antwort und ersetze sie durch etwas Sichereres.
Jmiserez

Nun, askubuntu.com/a/80248/22308 mach das einfach mitsort -h
Nam G VU

36

Versuchen Sie etwas wie:

du -h folder | sort -h

Alternativen: -nzur numerischen Sortierung

Hinweis: Die -hSortieroption ist nur in neueren Versionen von Ubuntu verfügbar.


3
Es gibt Version 8.17, also denke ich, das ist der einfachste Weg
steabert

1
Vielen Dank an steabert für den Hinweis, dass der Sortierbefehl von sort --version = 8.17 verbessert wurde. Dies ist die beste Antwort für neuere Versionen von Ubuntu.
Kat Amsterdam

Dies sollte die akzeptierte sein, da es Clean-Shoots gibt, die das OP mitsort -h
Nam G VU

4

Diese Antwort ist gültig für 10.04.4LTS und niedrigere Versionen von Ubuntu.

Leider ist die genaue Antwort, die KMG sortiert, schwierig und komplex:

Sie können den gesamten du-Befehl mit einem Alias ​​versehen, der so für Menschen lesbar ist

alias duf='du -sk * | sort -n | perl -ne '\''($s,$f)=split(m{\t});for (qw(K M G)) {if($s<1024) {printf("%.1f",$s);print "$_\t$f"; last};$s=$s/1024}'\'

was ich hier gefunden habe

http://www.earthinfo.org/linux-disk-usage-sorted-by-size-and-human-readable/

cd einfach in den ordner den du dann duf wissen möchtest

Sie können diesen Duf-Alias ​​an das Ende Ihres /home/user/.profile anfügen, um den Befehl duf halb-dauerhaft zu machen

Ergebnisse:

user@hostname:~$ duf
0.0K  Documenten
0.0K  Muziek
0.0K  Openbaar
0.0K  Sjablonen
0.0K  Video's
4.0K  backup_db.sql.g
4.0K  examples.desktop
12.0K xml printer ticket
52.0K hardinfo_report.html
152.0K    librxtxSerial.so
2.7M  jpos
4.4M  nxclient_3.5.0-7_amd64.deb
6.4M  nxnode_3.5.0-4_amd64.deb
6.8M  Downloads
7.4M  nxserver_3.5.0-5_amd64.deb
12.4M NetBeansProjects
18.1M mysqlworkbench.deb
28.3M Afbeeldingen
45.8M ergens-20110928-18.sql.gz
60.5M 2012-06-02ergens_archive.tar.gz
65.5M 2012-08-26ergens_archive.tar.gz
65.6M 2012-08-28ergens_archive.tar.gz
65.6M 2012-08-29ergens_archive.tar.gz
65.7M 2012-08-30ergens_archive.tar.gz
113.0M    Bureaublad
306.2M    ergens-20110928-18.sql

Hier ist, warum du -sch /var/* | sort -nfunktioniert das Sortieren von MKKMMKKMMK nicht

user@hostname:~$ du -sch /var/* |sort -n

0 /var/crash
0 /var/local
0 /var/lock
0 /var/opt
8,0M  /var/backups
12K   /var/games
16K   /var/tmp
17M   /var/log
68M   /var/cache
104K  /var/spool
144K  /var/run
351M  /var/lib
443M  totaal
704K  /var/mail

Ich habe dies den Gnu-Core-Entwicklern mit einer Feature-Anfrage gemeldet, um die du -h-Funktion mit einem Sortier-Feature zu verbessern. via bugs-coreutils@gnu.org
Kat Amsterdam

+1, ähnliche du folder | sort -n | cut -f 2 | while IFS= read -r -d '' path; do du -sh -- "$path"; done
Einzeiler

Habe gerade deinen 1 Liner auf einem Live-System ausprobiert. Erhalten Sie einen Fehler "Zugriff verweigert" und keine Du-Ergebnisse. Haben Sie diesen Befehl zuerst auf einem Ubuntu-System ausprobiert? Ich habe den Ordner in / home / username geändert
Kat Amsterdam

oh, sorry, du solltest das fallen lassen -d '', das ist ein Überbleibsel von der Verwendung in der Ausgabe des Dateibefehls.
Steabert

Dies scheint auf Nicht-Linux-Systemen zu funktionieren, die GNU nicht unterstützen sort.
Stefan Lasiewski

2

Der Befehl GNU sorthat die folgende Option:

-h, --human-numeric-sort Vergleichen Menschen lesbaren Zahlen (zB 2K 1G).

Um diese Option unter BSD / OSX zu haben, können Sie sortvon coreutils(via brew) installieren und den bin-Ordner zu PATHIhren rc- Dateien hinzufügen .

Der Befehl würde also so aussehen:

du -ah . | sort -rh | head -20

0

Verwenden Sie für neuere Versionen von Ubuntu du -h directory | sort -h.

Ich benutze diese Form die ganze Zeit, um Dateien zu finden, die außerhalb der Kontrolle liegen.


Duplikat der beantworteten 17. November 11 um 17:13 Uhr Allu2
Elder Geek

0

Öffne dein Terminal mit Ctrl+ Alt+ tund tippe:

  du -sk * | sort -rn 

: D Ich bin jetzt daran gewöhnt, die Tastenkombination Strg + Alt + t so weit in das obige Format zu ändern, dass ich das erforderliche Format in mein Xpad eingefügt habe. : D Fühlt sich toll an, für solch einen kleinen Job
gelobt

Jede Arbeit, die Sie hier gemacht haben, ist eine Ergänzung wert.
Donnerstag,

0

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

Was ist der Sinn des Ersetzens \ndurch \0? Ist es nicht ein bisschen zu spät dafür?
muru

Es bereitet die Eingabe für vor xargs -0, wobei erwartet wird, dass die Eingabe durch NUL getrennt ist (wie es find -print0 erzeugen würde). Andernfalls können Sie -0 nicht verwenden, und Apostrophe haben eine besondere Bedeutung.
Mark Crossfield

Ich weiß es -0, aber es ist irrelevant: imgur.com/87w3vfj
muru

Ich denke, das funktioniert, da Sie ein Backtick verwendet haben, kein Apostroph. gist.github.com/mrmanc/8aef830945ce03aa65f0
Mark Crossfield

0

Die, die ich auf allen Systemen unabhängig von der Version gefunden habe ( sort -hfunktioniert bei mir nicht), ist

du -h $(du * | sort -n | awk '{print $2}')

das awk '{print $2}'druckt im Grunde Dateinamen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.