Funziona (aggiornato per incorporare il suggerimento di Daniel Andersson):
find -type f -printf '%T+ %p\n' | sort | head -n 1
Questo è un po' più portabile e perché non si basa su GNU find
estensione -printf
, quindi funziona anche su BSD / OS X:
find . -type f -print0 | xargs -0 ls -ltr | head -n 1
L'unico aspetto negativo qui è che è in qualche modo limitato alla dimensione di ARG_MAX
(che dovrebbe essere irrilevante per la maggior parte dei kernel più recenti). Quindi, se ce ne sono più di getconf ARG_MAX
caratteri restituiti (262.144 sul mio sistema), non ti dà il risultato corretto. Inoltre, non è conforme a POSIX perché -print0
e xargs -0
non lo è.
Alcune altre soluzioni a questo problema sono descritte qui:Come posso trovare il file più recente (il più recente, il più antico, il più vecchio) in una directory? – Wiki di Greg
È garantito che i seguenti comandi comandi funzionino con qualsiasi tipo di nome di file strano:
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/[^ ]* //')"
Utilizzando un byte nullo (\0
) invece di un carattere di avanzamento riga (\n
) assicura che l'output di find sia ancora comprensibile nel caso in cui uno dei nomi di file contenga un carattere di avanzamento riga.
L'-z
switch fa in modo che sia sort che grep interpretino solo i byte nulli come caratteri di fine riga. Dato che non esiste un tale interruttore per la testa, usiamo grep -m 1
invece (solo un'occorrenza).
I comandi sono ordinati per tempo di esecuzione (misurato sulla mia macchina).
-
Il primo comando sarà il più lento poiché deve prima convertire l'mtime di ogni file in un formato leggibile dall'uomo e quindi ordinare quelle stringhe. Piping to cat evita di colorare l'output.
-
Il secondo comando è leggermente più veloce. Sebbene esegua ancora la conversione della data, l'ordinamento numerico (
sort -n
) i secondi trascorsi dall'epoca Unix sono un po' più veloci. sed cancella i secondi dall'epoca Unix. -
L'ultimo comando non esegue alcuna conversione e dovrebbe essere significativamente più veloce dei primi due. Il comando find in sé non visualizzerà l'mtime del file più vecchio, quindi è necessario stat.
Pagine man correlate:find – grep – sed – sort – stat