Frage Wie kann ich die Ausgabe nach Größe sortieren?


Ich brauche eine Liste von menschenlesbaren Ausgaben.

Jedoch, du hat keine "Sortieren nach Größe" -Option und Rohrleitungen zu sort funktioniert nicht mit der menschenlesbaren Flagge.

Zum Beispiel:

du | sort -n -r 

Gibt eine sortierte Datenträgerverwendung nach Größe aus (absteigend):

du |sort -n -r
65108   .
61508   ./dir3
2056    ./dir4
1032    ./dir1
508     ./dir2

Wenn Sie es jedoch mit dem für Menschen lesbaren Flag ausführen, wird es nicht richtig sortiert:

du -h | sort -n -r

508K    ./dir2
64M     .
61M     ./dir3
2.1M    ./dir4
1.1M    ./dir1

Kennt jemand eine Art zu sortieren du -h  nach Größe?


830
2018-02-25 13:42


Ursprung


Heh ... Lustig solltest du fragen, denn das nervt mich schon seit über einem Jahr. Letzte Woche habe ich den Code in GNU Coreutils heruntergeladen (von denen die Sorte ein Teil ist), und ich habe einen Blick darauf geworfen, aber ich entschied, dass es etwas länger dauern würde, als ich in meinen Händen hatte. :) - unwind
Hier ist eine viel verwandte Frage: serverfault.com/q/737537/35034 - cregox
Hast du diesen gesehen? unix.stackexchange.com/questions/4681/...  Es ist ein Beinahe-Duplikat und ist Gold wert. Du machst ein normales du aber füge das -h hinzu sort Befehl. Du kannst hinzufügen -rh also die größten sind zuerst in der Datei, sonst brauchst du tail um die Weltraumfresser zu sehen. - SDsolar
Ich habe nicht erwartet, dass eine solche Frage so populär ist, wenn ich das google. - Mateen Ulhaq


Antworten:


Ab GNU Coreutils 7.5 veröffentlicht im August 2009, sort erlaubt a -h Parameter, der numerische Suffixe der von. erzeugten Art erlaubt du -h:

du -hs * | sort -h

Wenn Sie eine Sortierung verwenden, die dies nicht unterstützt -h, Sie können GNU Coreutils installieren. Z.B. auf einem älteren Mac OS X:

brew install coreutils
du -hs * | gsort -h

Von sort Handbuch:

-h, --human-numeric-sort compare human readable numbers (e.g., 2K 1G)


1152
2017-07-01 12:29



Der relevante Abschnitt des Handbuchs: gnu.org/software/coreutils/manual/... - wodow
Einfach zu installieren auf OS X mit Homebrew - Brew installieren Coreutils. - Richard Poirier
Gute! Ich persönlich habe es immer getan du -BM | sort -nrals Workaround - es ist menschlich lesbar genug, und es ist sortiert, wenn jemand mit älteren coreutils fest ist. - chutz
Wenn Sie OSX über Homebrew verwenden, beachten Sie, dass Sie jetzt gsort anstelle von sort verwenden müssen: du -hs * | gsort -h - Brian Cline
@PaulDraper, du -BM Gibt alles in Megabyte aus, sodass eine Datei mit 168 KB tatsächlich als 0M angezeigt wird. Es sei denn, es gibt eine andere Versionsdiskrepanz, die mir nicht bekannt ist. Meine Version von du zeigt nur Integer-Megabyte-Werte an. - chutz


du | sort -nr | cut -f2- | xargs du -hs

82
2018-02-25 13:52



Und es wird eine riesige Anzahl von Doppelzählungen tun. - Douglas Leeder
Zuerst macht es das normale du - dann berechnet es für jeden Eintrag die Größe neu, nur um es in einer für Menschen lesbaren Form zu drucken. - Douglas Leeder
@Douglas Leeder: Du bist richtig für das Duplizieren, aber denke, dass das zweite Du nicht vom Cold-Cache startet (Danke an das OS) @hasen j: xargs ist ein sehr nützlicher Befehl, teilt seine stdin und füttert sie als Argumente zu dem gegebenen Befehl - cadrian
Chris ist tatsächlich überlegen, da es mit Pfaden arbeitet, die Leerzeichen enthalten. Eine Abstimmung auf deine Art zu schmeißen, Kumpel. - rbright
Hässlich, aber plattformübergreifend :). - voretaq7


@ Douglas Leeder, eine weitere Antwort: Sortieren Sie die lesbare Ausgabe von du -h mit einem anderen Tool. Wie Perl!

du -h | perl -e 'sub h{%h=(K=>10,M=>20,G=>30);($n,$u)=shift=~/([0-9.]+)(\D)/;
return $n*2**$h{$u}}print sort{h($b)<=>h($a)}<>;'

Auf zwei Zeilen aufteilen, um das Display anzupassen. Sie können es auf diese Weise verwenden oder es zu einem One-Liner machen, es wird in beide Richtungen funktionieren.

Ausgabe:

4.5M    .
3.7M    ./colors
372K    ./plugin
128K    ./autoload
100K    ./doc
100K    ./syntax

BEARBEITEN: Nach ein paar Runden Golf bei PerlMonksDas Endergebnis ist folgendes:

perl -e'%h=map{/.\s/;99**(ord$&&7)-$`,$_}`du -h`;die@h{sort%h}'

59
2018-02-25 21:04



Ihre Kurzversion gibt an stderr wegen dem die Kannst du es ändern, damit es ausgegeben wird? stdout? - Dennis Williamson
Ändere das die zu einem print und es wird gehen stdout. Es sind nur noch zwei Charaktere. - Adam Bellaire
funktioniert auf ubuntu! - marinara
beeindruckende Perl-Hacks - nandoP
Das Ergebnis ist in umgekehrter Reihenfolge :( - RSFalcon7


Es gibt ein immens nützliches Werkzeug, das ich genannt habe ncdu Das dient dazu, diese lästigen Ordner und Dateien mit hoher Festplattennutzung zu finden und sie zu entfernen. Es ist konsolenbasiert, schnell und leicht und enthält Pakete für alle wichtigen Distributionen.


50
2018-02-25 20:39



Sehr schön ... ich wondier, wenn die Ergebnisse genormt ausgegeben werden könnten ... ich bin so faul, dass ich das Handbuch nicht lesen kann - ojblass
gt5 ist in der gleichen Ader; seine beste Eigenschaft ist Wachstum. - Tobu
Das ist echt cool! Und viel schneller als herumhängen du, wenn Sie nur die großen Verzeichnisse identifizieren möchten. - BurninLeo


du -k * | sort -nr | cut -f2 | xargs -d '\n' du -sh

43
2018-02-25 14:01



Genau das, wonach ich gesucht habe, danke - Edward Tanguay
Kann nicht mit verwenden du -k --totalgibt am Ende Fehler du: cannot access 'total': No such file or directory - laggingreflex
Ich mag dieses eine mehr jede andere Antwort. Wie würdest du gehen, um nur die ersten 50 Ergebnisse zu zeigen? - Mauro
@Mauro - schicke einfach das Ergebnis an head durch Hinzufügen von `| Kopf -50` am Ende. - Samuel Lelièvre


Soweit ich sehen kann, haben Sie drei Möglichkeiten:

  1. Ändern du vor der Anzeige sortieren.
  2. Ändern sort menschliche Größen für numerische Sortierung zu unterstützen.
  3. Veröffentlichen Sie die Ausgabe von sort, um die Basisausgabe in "menschenlesbar" zu ändern.

Sie könnten auch tun du -k und lebe mit Größen in KiB.

Für Option 3 könnten Sie das folgende Skript verwenden:

#!/usr/bin/env python

import sys
import re

sizeRe = re.compile(r"^(\d+)(.*)$")

for line in sys.stdin.readlines():
    mo = sizeRe.match(line)
    if mo:
        size = int(mo.group(1))
        if size < 1024:
            size = str(size)+"K"
        elif size < 1024 ** 2:
            size = str(size/1024)+"M"
        else:
            size = str(size/(1024 ** 2))+"G"

        print "%s%s"%(size,mo.group(2))
    else:
        print line

20
2018-02-25 13:53





Ich hatte dieses Problem auch und verwende derzeit eine Umgehungslösung:

du -scBM | sort -n

Dies wird keine skalierten Werte erzeugen, sondern immer die Größe in Megabyte. Das ist weniger als perfekt, aber für mich ist es besser als nichts (oder die Größe in Bytes anzeigen).


19
2018-02-25 13:56



Ich mag th -BM Schalter, der im Grunde ist das gleiche wie-m, aber es hat den Vorteil der Anzeige der Größe und M postfixed, so dass Sie 10M, die viel klarer als nur 10 ist :) - Tom Feiner
Dies ist die einfachste Lösung, die ich bisher auf dieser Seite gesehen habe, danke! - Jeff Olson