Das funktioniert (aktualisiert, um den Vorschlag von Daniel Andersson aufzunehmen):
find -type f -printf '%T+ %p\n' | sort | head -n 1
Dieses hier ist etwas portabler und weil es nicht auf GNU find
angewiesen ist Erweiterung -printf
, also funktioniert es auch unter BSD / OS X:
find . -type f -print0 | xargs -0 ls -ltr | head -n 1
Der einzige Nachteil hier ist, dass es etwas auf die Größe von ARG_MAX
beschränkt ist (was sollte für die meisten neueren Kernel irrelevant sein). Also, wenn es mehr als getconf ARG_MAX
sind Zeichen zurückgegeben (262.144 auf meinem System), gibt es Ihnen nicht das richtige Ergebnis. Es ist auch nicht POSIX-konform, weil -print0
und xargs -0
nicht.
Einige weitere Lösungen für dieses Problem werden hier skizziert:Wie finde ich die neueste (neueste, früheste, älteste) Datei in einem Verzeichnis? – Gregs Wiki
Die folgenden Befehle funktionieren garantiert mit allen seltsamen Dateinamen:
find -type f -printf "%T+ %p\0" | sort -z | grep -zom 1 ".*" | cat
find -type f -printf "%[email protected] %T+ %p\0" | \
sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //'
stat -c "%y %n" "$(find -type f -printf "%[email protected] %p\0" | \
sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //')"
Mit einem Null-Byte (\0
) anstelle eines Zeilenvorschubzeichens (\n
) stellt sicher, dass die Ausgabe von find immer noch verständlich ist, falls einer der Dateinamen ein Zeilenvorschubzeichen enthält.
Die -z
switch bewirkt, dass sowohl sort als auch grep nur Null-Bytes als Zeilenende-Zeichen interpretieren. Da es für Kopf keinen solchen Schalter gibt, verwenden wir grep -m 1
stattdessen (nur ein Vorkommen).
Die Befehle sind nach Ausführungszeit geordnet (gemessen auf meinem Rechner).
-
Der erste Befehl ist der langsamste, da er zuerst die mtime jeder Datei in ein für Menschen lesbares Format konvertieren und dann diese Zeichenfolgen sortieren muss. Piping to cat vermeidet das Einfärben der Ausgabe.
-
Der zweite Befehl ist etwas schneller. Während es noch die Datumskonvertierung durchführt, wird die numerische Sortierung (
sort -n
) sind die seit der Unix-Epoche verstrichenen Sekunden etwas schneller. sed löscht die Sekunden seit der Unix-Epoche. -
Der letzte Befehl führt überhaupt keine Konvertierung durch und sollte deutlich schneller sein als die ersten beiden. Der Find-Befehl selbst zeigt nicht die mtime der ältesten Datei an, also wird stat benötigt.
Zugehörige Manpages:find – grep – sed – sort – stat