Ich möchte den gesamten Inhalt eines Verzeichnisses auflisten, einschließlich des Inhalts von Unterordnern, aber sortiert nach Dateigröße. Bisher habe ich es geschafft, so weit wie möglich aufzulisten und zu sortieren, während ich noch rekursiv bin ls -lhSR
(das h
ist schön zu haben, aber definitiv nicht wesentlich für mich, solange ich Dateigrößen erhalten kann). Ich übersehen wahrscheinlich etwas Offensichtliches oder frage nach dem Unmöglichen, aber jeder Rat hier wäre sehr dankbar.
9
Da Sie keine bestimmte Shell angegeben haben, finden Sie hier eine Alternative, bei der die Glob-Qualifikationsmerkmale von zsh mit verwendet werden
für die Rekursion. Dann zum Beispiel:
rekursiv einfache Dateien auflisten:
rekursiv auflisten einfache Dateien, o rdered durch in Falten L ength (dh Größe):
rekursiv Liste einfache Dateien, O rdered durch de Knitter Größe:
Listen Sie rekursiv einfache Dateien auf, sortiert nach abnehmender Größe, und wählen Sie die drei besten Ergebnisse aus:
Wenn Sie auch die Dateigrößen möchten, können Sie verwenden
quelle
Mit der
globstar
Shell-Option können Sie Shell-Globbing verwenden:Wenn Sie dies mit zu vielen Dateien versuchen, wird der Fehler "Argumentliste zu lang" angezeigt. Um Arbeit um das, können Sie verwenden ,
printf
undxargs
:Ich habe gerade festgestellt, dass dies auch die Verzeichnisse (mit einer Größe von 4096 Bytes) druckt - wenn Sie das nicht wollen, verwenden Sie stattdessen Folgendes:
Beispiellauf
quelle
dotglob
Shell-Option einstellen , siehe meine aktualisierte Antwort.printf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
ls -lhSd **/*
wenn es Ihnen nichts ausmacht, die Verzeichnisse als Teil der Liste zu haben. Oder wenn keiner Ihrer Verzeichnisnamen.
und alle gewünschten Dateien enthalten sind , können Siell -hS **/*.*
oder ähnliches.Wenn Sie kein zsh haben, können Sie immer noch
du
+ verwendensort
:Vom Menschen lesbare Größen, einschließlich der kumulierten Größen von Verzeichnissen:
Nur Dateien (mit
find
):In beiden Fällen habe ich Gebrauch nullterminierte Linien entschieden (
-0
,-z
,-print0
Optionen), sicher gegen alle gültigen Dateinamen zu sein.quelle
Für eine schnelle interaktive Verwendung in Verzeichnisbäumen, die nicht zu groß sind,
shopt -s globstar
ist das wirklich nett. Ein Glob kann keine Verzeichnisse herauszufiltern auf Typ basiert, aber wenn Sie es verwenden , um mitls -d
dannls
wird nur die Verzeichnisnamen drucken, statt die Inhalte.Angenommen, Ihr
ll
Alias umfasst-lh
:Sie erhalten eine Ausgabe wie diese (aus meinem Code-Golf-Verzeichnis), jedoch mit farblicher Hervorhebung (damit die Verzeichnisse leichter zu sehen sind). Beachten Sie, dass die Sortierung nach Dateigröße über Unterverzeichnisse hinweg erfolgte.
Sie können die Verzeichnisse durch Durchleiten herausfiltern
grep -v '^d'
Sie können manchmal einen Glob verwenden, der nur mit Dateien und nicht mit Verzeichnissen übereinstimmt, wenn Ihre Dateinamen ein Muster haben. zB
ll -rSd **/*.jpg
oder**/*.*
funktioniert sogar, wenn keiner Ihrer Verzeichnisnamen.
und alle gewünschten Dateien enthalten sind .(Für Leute mit DOS-Hintergrund: Unter
*.*
Unix ist nichts Magisches . Es stimmt nur mit jedem Verzeichniseintrag überein, der einen Literalpunkt enthält. Abgesehen von ausführbaren Dateien und manchmal Textdateien ist es jedoch üblich, Dateinamen mit Erweiterungen zu versehen.)@dessert weist darauf hin, dass Sie es benötigen würden
shopt -s dotglob
, um mit allen Dateien übereinzustimmen .Mit GNU
find
Wenn nicht zu viele Dateien in eine
ls
Befehlszeile passen ,find -exec ls {} +
werden sie alle in der Befehlszeile abgelegt, wols
sie sortiert werden können.Durch Verwenden von
-not -type d
anstatt zu-type f
vermeiden, dass Symlinks, Named Pipes, Sockets, Gerätedateien und alles, was Sie sonst noch in Ihren Verzeichnissen herumtrampeln, ignoriert werden.Mit
du
:Jetzt werden Verzeichnisnamen in der Liste sortiert, um die Summe aller Inhalte zu erhalten, aber einzelne Dateien sind weiterhin enthalten.
sort -h
, aka--human-numeric-sort
, sortiert Zahlen mit Größensuffixen wiedu -h
Drucke. Es ist perfekt für die Verwendung mitdu
.Ich benutze oft
du -sch * | sort -h
oder*/
nur Verzeichnisse zu bekommen.du -sch **/* | sort -h
würde Ihnen die obige Ausgabe geben, wenn Sie vergessen, dassdu
eine-a
Option hat.(Ich habe mir nur die Zeit genommen, um nachzuschlagen, weil ich eine Antwort poste. Für die interaktive Verwendung hätte ich sie wahrscheinlich nur verwendet
du -sch **/*
.quelle