Esto funciona (actualizado para incorporar la sugerencia de Daniel Andersson):
find -type f -printf '%T+ %p\n' | sort | head -n 1
Este es un poco más portátil y porque no depende de GNU find
extensión -printf
, por lo que también funciona en BSD / OS X:
find . -type f -print0 | xargs -0 ls -ltr | head -n 1
El único inconveniente aquí es que está algo limitado al tamaño de ARG_MAX
(que debería ser irrelevante para la mayoría de los núcleos más nuevos). Entonces, si hay más de getconf ARG_MAX
caracteres devueltos (262,144 en mi sistema), no le da el resultado correcto. Tampoco es compatible con POSIX porque -print0
y xargs -0
no lo es.
Algunas soluciones más a este problema se describen aquí:¿Cómo puedo encontrar el archivo más reciente (más nuevo, más antiguo, más antiguo) en un directorio? – Wiki de Greg
Se garantiza que los siguientes comandos funcionan con cualquier tipo de nombre de archivo extraño:
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/[^ ]* //')"
Usando un byte nulo (\0
) en lugar de un carácter de salto de línea (\n
) se asegura de que la salida de find siga siendo comprensible en caso de que uno de los nombres de archivo contenga un carácter de salto de línea.
El -z
switch hace que sort y grep interpreten solo bytes nulos como caracteres de final de línea. Como no existe tal cambio para la cabeza, usamos grep -m 1
en cambio (solo una ocurrencia).
Los comandos están ordenados por tiempo de ejecución (medido en mi máquina).
-
El primer comando será el más lento, ya que primero tiene que convertir el mtime de cada archivo en un formato legible por humanos y luego ordenar esas cadenas. La tubería a cat evita colorear la salida.
-
El segundo comando es un poco más rápido. Si bien aún realiza la conversión de fecha, la clasificación numérica (
sort -n
) los segundos transcurridos desde la época de Unix son un poco más rápidos. sed borra los segundos desde la época de Unix. -
El último comando no realiza ninguna conversión y debería ser significativamente más rápido que los dos primeros. El comando de búsqueda en sí mismo no mostrará el mtime del archivo más antiguo, por lo que se necesita stat.
Páginas man relacionadas:find – grep – sed – sort – stat