Gibt es eine Möglichkeit , um die Liste aus allen Dateien innerhalb eines Verzeichnisses Baum in einer einzigen Liste, nach Änderungszeit auf Linux sortiert?
ls -Rlt
listet Dateien rekursiv auf, sie sind jedoch in der Ausgabe in verschiedenen Ordnern gruppiert, sodass die Ausgabe nicht als Ganzes sortiert ist. Nur der Inhalt jedes Verzeichnisses wird nach Zeit sortiert.
Antworten:
Ja, das können Sie mit GNU machen
find
. Wenn Ihre Dateinamen keine Zeilenumbrüche enthalten, können Sie Folgendes tun:Erläuterung
Mit der
-printf
Optionfind
können alle Arten von Informationen gedruckt werden. In diesem Fall verwenden wir:So
%T@ %p\n
druckt die Zeitpunkt der letzten Änderung der Datei in Sekunden seit der Epoche (%T@
), ein Leerzeichen und dann den Dateinamen (%p
).Diese werden dann übergeben, an
sort
die-n
nur im ersten Feld (-k1,1
) numerisch ( ) sortiert werden soll .Beachten Sie, dass dadurch alle Dateien und Verzeichnisse zurückgegeben werden. Um es nur auf reguläre Dateien zu beschränken (keine Verzeichnisse, Gerätedateien, Links usw.), fügen Sie
-type f
es Ihremfind
Befehl hinzu.Um lesbare Daten zu erhalten, können Sie die Ausgabe mit GNU verarbeiten
date
:Hier
perl
ersetzt der Befehl die erste Zeichenfolge von Nicht-Leerzeichen (das Datum) durch sich selbst, wie von GNU verarbeitetdate
.Das Obige schlägt für Dateinamen fehl, die Zeilenumbrüche enthalten. Verwenden Sie zum Umgang mit Zeilenumbrüchen:
Das ist das gleiche, außer dass
find
ein\0
statt eines\n
am Ende jedes Dateinamens ausgegeben wird . GNUsort
kann mit nulltrennenden Ausgaben umgehen, sodass es weiterhin korrekt sortieren kann. Der letztetr
Befehl übersetzt das\0
Zurück in\n
.quelle
-printf
das nicht POSIX ist.date
um es neu zu formatieren :find -printf '%T@ %p\t\n' | sort -gk1,1 | sed -E "s/([^ ]*)/$(date -d \1)/"
. Siehe aktualisierte Antwort. Ich habe auch die (völlig unnötige) Verwendung von Tabs behoben.Mit
zsh
:** / * stimmen mit jeder Ebene von Unterverzeichnissen überein (und folgen keinen Symlinks).
D.
Qualifizierer listen reguläre Dateien auf,om
sortieren sie nach Änderungszeit, neueste zuerst.Wenn Sie möchten, dass die Dateinamen ohne den Verzeichnisteil aufgelistet werden, fügen Sie den
t
Verlaufsmodifikator hinzu:quelle
ARG_MAX
Nun , wenn Sie über viele, viele tausend Dateien sprechen - und damit über Ihr Limit hinaus -, wird es nicht so gut herauskommen, aber die einfachste Lösung ist:... die
ls
jeden Stapel von<=ARG_MAX
Dateien aufruft , den es finden kann. Es gibt auch keine willkürlichen Einschränkungen für die Zeichen in den Pfadnamen, nur für die maximale Anzahl von Argumenten, die zusammen verarbeitet werden können.Die Ausgabe wird identisch mit
find
der Ausgabe geschrieben. Sie können natürlich auch jede andere Option verwenden, z. B.-l
oder GNUs-h
. Hier sind einige davon, die von einem kleinen Baum aufgelistet wurden, den ich vor einer Woche erstellt habe:... die ganz offensichtlich nicht nach Verzeichnis gruppiert sind.
Auf meiner Maschine ...
... aber ich denke nicht, dass das realistisch ist. Ich denke, es ist im Durchschnitt eher 65k oder so.
quelle