¿Cómo enumerar archivos de forma recursiva y ordenarlos por hora de modificación?

13

¿Cómo enumero todos los archivos en un directorio de forma recursiva y clasifico el resultado por hora de modificación?

Normalmente uso ls -lhtcpero no encuentra todos los archivos de forma recursiva. Estoy usando Linux y Mac.

ls -l en Mac OS X puede dar

-rw-r--r--    1 fsr  user      1928 Mar  1  2011 foo.c
-rwx------    1 fsr  user      3509 Feb 25 14:34 bar.c

donde la parte de la fecha no es consistente o alineada, por lo que una solución debe tener esto en cuenta.

Solución parcial

stat -f "%m%t%Sm %N" ./* | sort -rn | head -3 | cut -f2-

funciona, pero no de forma recursiva.

qazwsx
fuente
Asumiré que está en Linux, pero debe especificar su sistema operativo explícitamente en la pregunta o preferiblemente como una etiqueta.
EBGreen

Respuestas:

2

Aquí hay un método que usa statcomo @ johnshen64 sugirió

find . -type f -exec stat -f "%m%t%Sm %N" '{}' \; | sort -rn | head -20 | cut -f2-
Computista
fuente
find "$PWD" -type f -exec stat -f $'%m\t%N' '{}' \; | sort -rn | cut -f2-imprimiría solo las rutas absolutas de los archivos en OS X.
Lri
stat¿Qué versión de estás usando? Su formato anterior no funcionó para mí. Tuve que usar la siguiente: find . -type f -exec stat --printf "%Y\t%y %N\n" '{}' \; | sort -rn | cut -f2-. Esto es constat (GNU coreutils) 8.23
user84207
12

Use find's -printfy ordene en un formato de fecha razonable:

find -type f -printf '%T+\t%p\n' | sort -n

Esto debería minimizar las horquillas de proceso y, por lo tanto, ser el más rápido.

Ejemplos si no le gusta la segunda parte fraccionaria (que a menudo no se implementa en el sistema de archivos de todos modos):

find -type f -printf '%T+\t%p\n' | sed 's/\.[[:digit:]]\{10\}//' | sort -n
find -type f -printf '%T+\t%p\n' | cut --complement -c 20-30 | sort -n

EDITAR: Estándar finden Mac no tiene -printf. Pero no es difícil instalar GNU find en Mac (también vea ese enlace para obtener más advertencias sobre la compatibilidad de Mac / Linux y xargs).

Daniel Andersson
fuente
0

find .debería poder obtener todos los archivos. Algo como esto:

find . -exec ls -dl '{}' \; | sort -k 6,7

Necesita ajustarlo para sus necesidades.

johnshen64
fuente
También supongo que es Linux, como dijo EBGreen, ls es un alias en Windows PS, por lo que debe usar sort-object y obtener elementos secundarios de forma recursiva si ese es el caso, pero la idea es la misma.
johnshen64
¿Realmente funciona correctamente cuando las fechas a veces se pierden la parte del año, en Mac?
qazwsx
tienes razón, la visualización de la fecha para los archivos recientes arruinará las cosas. necesita usar stat en su lugar para obtener la fecha con formato exacto en ese caso. todos mis archivos son muy antiguos, por lo que el comando funcionó bien, por eso agregué la cláusula tune :-)
johnshen64
@ johnshen64: lsen Linux tiene una --time-formatopción que puede usar para garantizar que las fechas de los archivos recientes y anteriores se muestren en el mismo formato.
RedGrittyBrick
ah gracias, tienes razón, simplemente no he usado eso. eso es mucho más simple que usar stat. se llama --time-style, creo.
johnshen64
0

Esta respuesta a una pregunta similar en el sitio Unix Stack Exchange me ayudó porque estaba usando zsh:

Cómo enumerar archivos ordenados por fecha de modificación de forma recursiva (¡no hay un comando stat disponible!)

Brad Parks
fuente
Esto es realmente un comentario y no una respuesta a la pregunta original. Siempre puedes comentar tus propias publicaciones, y una vez que tengas suficiente reputación podrás comentar cualquier publicación . Lea ¿Por qué necesito 50 reputación para comentar? ¿Qué puedo hacer en su lugar?
DavidPostill