nur Dateinamen abrufen ... sortiert nach Änderungsdatum
find
+ sort
+ cut
Ansatz:
find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort | cut -d' ' -f2
-
%[email protected]
- Zeitpunkt der letzten Änderung der Datei, wobei@
ist Sekunden seitJan. 1, 1970, 00:00 GMT,
mit Bruchteil -
%f
- Dateiname ohne führende Verzeichnisse (nur das letzte Element)
So sortieren Sie in absteigender Reihenfolge:
find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort -k1,1r | cut -d' ' -f2
Ihre Methode kann angepasst werden, um in einfachen Fällen zu funktionieren. Das Hauptproblem, mit dem Sie konfrontiert sind, besteht darin, dass Sie Eingaben weitergeben bis ls
, aber ls
nimmt keine Eingaben entgegen. ls
nimmt Kommandozeilenargumente. Sie müssen also die Ausgabe von find
übergeben als Argumente bis ls
, mit einer Befehlssubstitution. Falls ein Verzeichnis gefunden wird, übergeben Sie außerdem -d
bis ls
um das Verzeichnis selbst und nicht seinen Inhalt aufzulisten.
OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))
Nur in einfachen Fällen, da es zwei Einschränkungen gibt:
- Dies beruht auf einer Befehlsersetzung ohne Anführungszeichen (ebenso wie die Verwendung von
$OLDDATA
danach). Daher wird davon ausgegangen, dass die Dateinamen keine Sonderzeichen (Leerzeichen oder Platzhalterzeichen\[*?
enthalten ). - Einige Versionen von
ls
kann Zeichen entstellen, die im aktuellen Gebietsschema nicht druckbar sind. - Wenn die Gesamtlänge der Dateinamen zu lang ist, erhalten Sie eine Fehlermeldung. (Beachten Sie, dass
find … -exec
undxargs
kann hier nicht helfen, seitls
muss einmal ausgeführt werden, damit die Reihenfolge der Dateinamen richtig ist. Alles, was sie tun könnten, ist, Fehler zu verbergen und eine nicht korrekt sortierte Ausgabe zu erzeugen – und im Fall vonxargs
ein paar weitere Zeichen zu verstümmeln .)
Eine robuste, einfache Möglichkeit, dies zu tun, ist die Verwendung von zsh. Dank Glob-Qualifizierern kann es Wildcard-Übereinstimmungen sortieren.
setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
- Da dies kein anderes Programm aufruft, gibt es außer dem verfügbaren Speicher keine Längenbegrenzung und kein Risiko, dass Dateinamen an irgendeiner Stelle verstümmelt werden.
- Das Ergebnis ist eine Liste von Strings (jeder String ist ein Dateiname), kein String, also geht es in eine Array-Variable.
**/
durchläuft Unterverzeichnisse rekursiv und vermeidet die Verwendung vonfind
.##
bedeutet „eines oder mehrere der vorhergehenden“ in der erweiterten zsh-Glob-Syntax, es ist analog zu+
in (erweiterter) Regex-Syntax.(om)
ist ein Glob-Qualifizierer, um Dateien nach Änderungszeit zu sortieren, wiels -t
.
Es gibt bekanntermaßen keinen einfachen Weg, dies robust mit POSIX-Tools oder sogar mit GNU-Tools und ksh zu tun.