La combinación de findy lsfunciona 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 findpodemos hacer coincidir todos los archivos interesantes como este:
find . -name "my-pattern" ...
luego usando -print0podemos pasar todos los nombres de archivos de forma segura a la lssiguiente:
find . -name "my-pattern" -print0 | xargs -r -0 ls -1 -t
findAquí se pueden agregar parámetros y patrones de búsqueda adicionales
find . -name "my-pattern" ... -print0 | xargs -r -0 ls -1 -t
ls -tclasificará los archivos por hora de modificación (la más nueva primero) e imprimirá uno en una línea. Puede usar -cpara ordenar por hora de creación. Nota : esto se romperá con los nombres de archivo que contienen nuevas líneas.
Finalmente head -1nos 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, xargsllamará lsvarias 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" -print0si no desea buscar archivos a través de subcarpetas.
Nota 3: Como lo señaló @starfry: el -rargumento xargses para evitar la llamada de ls -1 -t, si el archivo no coincide find. Gracias por la sugerencia.