Ich suche im Grunde nach Dateien und sortiere sie dann nach der Größe. Das Skript funktioniert, wenn ich die Größe nicht nach lesbar sortiere. Aber ich möchte, dass die Größe für Menschen lesbar ist. Wie kann ich Größen sortieren, die für Menschen lesbar sind?
Zum Beispiel:
ls -l | sort -k 5 -n | awk '{print $9 " " $5}'
Dies funktioniert wie erwartet, ich habe die Größe meiner Dateien in Bytes aufsteigend erhalten:
1.txt 1
test.txt 3
bash.sh* 573
DocGeneration.txt 1131
andres_stuff.txt 1465
Branches.xlsx 15087
foo 23735
bar 60566
2016_stuff.pdf 996850
Jetzt möchte ich, dass die Größe für Menschen lesbar ist, also habe ich ls einen -h-Parameter hinzugefügt, und jetzt sind einige Dateien nicht in der richtigen Reihenfolge:
ls -lh | sort -k 5 -n | awk '{print $9 " " $5}'
1.txt 1
DocGeneration.txt 1.2K
andres_stuff.txt 1.5K
test.txt 3
Branches.xlsx 15K
foo 24K
bar 60K
bash.sh* 573
2016_stuff.pdf 974K
-k 5
- Wie funktioniert das?ls
Ausgabedu
stattls
könnte eine gute Idee sein.find
ist-printf
mit seinem%p
und%s
Formatierer (durch eine ‚Humanisierung‘ der Größen folgen).Antworten:
Versuchen
sort -h k2
Es ist Teil der Gnu-Sorte, der BSD-Sorte und anderer.
quelle
ls
nicht vermieden werden?ls
und verwenden stattdessen File Globbing direkt. Globbing alleine funktioniert hier nicht. Das heißt, ich würde es wahrscheinlich vorziehendu
.files=(); for f in *; do [[ -L "$f" ]] && files+=("$f"); done; echo ${#files[@]}
(Ich habe möglicherweise einen falschen Symlink- Testschalter ). Wenn Sie sich nicht für Symlinks interessierenfiles=(*); echo ${#files[@]}
, wird dieser portabel, wenn Sieset
Arrays verwenden und nicht.ls
Wenn diese Funktionalität integriert ist, verwenden Sie die-S
Option und sortieren Sie in umgekehrter Reihenfolge:ls -lShr
quelle
-h
nicht um eine Standard -ls
Option , aber brauchbar sein muss , wenn OP es bereits. Der Rest ist Standard und es ist sicherlich die Antwort, die ich geschrieben hätte.ls
.-S
Möglicherweise nicht für Sie verfügbarls
. FWIW-S
wird sogar mit der Emacs-Bibliothek unterstütztls-lisp.el
, die verwendet wird, wenn das Betriebssystem keine hatls
. Es funktioniert beispielsweise in Emacs unter MS Windows.-h
möglicherweise nicht universell verfügbar ist, aber OP verwendet es trotzdem. sollte-S
wirklich universell verfügbar sein, da es sich um den POSIX-Link handelt, den Toby bereitstellt. Es gibt jedoch einige Nicht-POSIX-Toolkits.Da keine bestimmte Shell erwähnt wurde, gehen Sie wie
zsh
folgt vor:Das
**
Glob-Muster stimmt mit den Pfadnamen überein,*
jedoch/
wie in einer rekursiven Suche.Der
ls
Befehl würde lesbare Größen mit-h
und ein Langlisten-Ausgabeformat mit aktivieren-l
. Die-f
Option deaktiviert die Sortierung undls
listet die Dateien nur in der angegebenen Reihenfolge auf.Diese Reihenfolge ist nach dem
**/*(.Lk-1024oL)
Dateinamen-Globbing-Muster angeordnet, sodass die kleineren Dateien zuerst aufgelistet werden. Das**/*
Bit stimmt mit jeder Datei und jedem Verzeichnis in diesem Verzeichnis und darunter überein,(...)
ändert jedoch das Verhalten des Globs (es ist ein "Glob-Qualifizierer").Es ist das
oL
am Ende, das (o
) die Namen nach Dateigröße (L
, "Länge") ordnet .Am
.
Anfang stimmt der Glob nur mit regulären Dateien überein (keine Verzeichnisse).Das
Lk-1024
Bit wählt Dateien aus, deren Größe weniger als 1024 KB beträgt ("Länge in KB weniger als 1024").Wenn dies
zsh
nicht Ihre primäre interaktive Shell ist, können Sie sie verwendenVerwenden Sie
setopt GLOB_DOTS
(oderzsh -o GLOB_DOTS -c ...
), um auch versteckte Namen abzugleichen. ... oder einfachD
zur Glob-Qualifikationszeichenfolge hinzufügen .Erweitern Sie das Obige unter der Annahme, dass Sie eine zweispaltige Ausgabe mit Pfadnamen und lesbaren Größen wünschen, und unter der Annahme, dass Sie über
numfmt
GNU-Coreutils verfügen .oder schneller,
quelle
Wenn Sie
sort
nicht über die-h
Option verfügen, können Sie einen (wenn auch sehr langen) awk-Befehl wie den folgenden verwenden:Dadurch wird Ihre Ausgabe in Bytes sortiert und anschließend in ihre lesbare Größe konvertiert.
quelle
Würde das funktionieren?
Die erste
awk
Exp sucht nach Dateien, die kleiner als 1 MB sind, und die zweite Exp nimmt die Bytegröße aus dem Ergebnis und konvertiert sie in KB. Die ersten drei Elemente werden gedruckt, um eine für Menschen lesbare Größe zu erhalten.quelle