¿Cómo puedo hacer 'find' find files en orden cronológico inverso?

17

Quiero encontrar archivos en subdirectorios ordenados por marca de tiempo (de creación), con el más reciente primero.

He mirado la página man pero parece que solo te permite filtrar por marca de tiempo en lugar de ordenar por marca de tiempo.

¿A qué opciones puedo pasar findpara lograr esto? Alternativamente, ¿cómo puedo combinarlo con otra herramienta, como sortordenar por marca de tiempo?

merlin2011
fuente
1
No puede hacer findnada en un orden ordenado en particular, más allá de elegir entre una búsqueda de profundidad y una búsqueda de amplitud.
Jonathan Leffler
@ merlin2011, revise su selección de respuestas aquí: la respuesta seleccionada actualmente es defectuosa (generará resultados que en realidad no están ordenados correctamente) cuando se encuentran más archivos de los findque se pueden pasar a una sola instancia ls.
Charles Duffy
@CharlesDuffy, ¡Gracias por la nota! He actualizado las respuestas aceptadas.
merlin2011

Respuestas:

32

Si bien la solución de Paul generalmente está bien, involucra más E / S que simplemente:

find bin/ -type f -printf '%Ts\t%p\n' | sort -nr | cut -f2
Peter Mortensen
fuente
¿Qué pasa si finddevuelve millones de archivos? ¿No va a ordenarlos todos como una lista muy larga? ¿Sigue siendo eficiente? (En lugar de ordenar cada directorio de forma independiente.)
Peter Mortensen
1
No funciona con personajes divertidos en nombres de archivo, como líneas nuevas
Boris Brodski
2
Esto merece solo un comentario sobre la respuesta del usuario 7385, pero no tengo la reputación de hacerlo. find bin/ -type f -printf '%Ts\t%p\0' | sort -nrz | cut -f2 -z | xargs -0 lsLas nuevas versiones de cuttienen la opción -z, por lo que los nombres de archivo con nuevas líneas funcionarían.
MattBlissett
La cantidad de E / S ni siquiera es la razón principal para preferir esta respuesta: la corrección es una distinción mucho más crítica. El xargs -0 ls -tenfoque no funcionará correctamente cuando haya tantos archivos que xargsnecesiten iniciarse lsmás de una vez, pero este enfoque continuará funcionando.
Charles Duffy
@PeterMortensen, "ordenarlos a todos como una lista muy larga" es la única forma de ordenarlos que realmente devuelve un resultado correcto. Además, la otra respuesta / aceptada tampoco "clasifica cada directorio de forma independiente" (si uno quisiera ordenar solo un directorio sin recurrir, se podría usar -maxdepth 1en el find).
Charles Duffy