La combinación de find
y ls
funciona bien para
- nombres de archivo sin líneas nuevas
- cantidad no muy grande de archivos
- nombres de archivo no muy largos
La solución:
find . -name "my-pattern" -print0 |
xargs -r -0 ls -1 -t |
head -1
Vamos a desglosarlo:
Con find
podemos hacer coincidir todos los archivos interesantes como este:
find . -name "my-pattern" ...
luego usando -print0
podemos pasar todos los nombres de archivos de forma segura a la ls
siguiente:
find . -name "my-pattern" -print0 | xargs -r -0 ls -1 -t
find
Aquí se pueden agregar parámetros y patrones de búsqueda adicionales
find . -name "my-pattern" ... -print0 | xargs -r -0 ls -1 -t
ls -t
clasificará los archivos por hora de modificación (la más nueva primero) e imprimirá uno en una línea. Puede usar -c
para ordenar por hora de creación. Nota : esto se romperá con los nombres de archivo que contienen nuevas líneas.
Finalmente head -1
nos obtiene el primer archivo en la lista ordenada.
Nota: xargs
use límites del sistema para el tamaño de la lista de argumentos. Si este tamaño excede, xargs
llamará ls
varias veces. Esto interrumpirá la clasificación y probablemente también la salida final. correr
xargs --show-limits
para verificar los límites de tu sistema.
Nota 2: utilícela find . -maxdepth 1 -name "my-pattern" -print0
si no desea buscar archivos a través de subcarpetas.
Nota 3: Como lo señaló @starfry: el -r
argumento xargs
es para evitar la llamada de ls -1 -t
, si el archivo no coincide find
. Gracias por la sugerencia.