Ordenar archivos por hora de modificación


8

He visto muchas preguntas y respuestas aquí usando una construcción en la línea de

list_dir=`ls -t /path/to/dir/`
for i in $list_dir; do

o

ls -t | while read i; do

Ahora, sé que no deberías usar ls en scripts porque se rompe fácilmente; pero no puedo encontrar una mejor manera de operar en archivos en orden desde la última modificación hasta la modificación más reciente (o viceversa).

Puedo usar algo como:

find . -type f -printf '%T@ %p\n' | sort -n | cut -d ' ' -f 2- | while read i; do...

... pero esto aún se romperá con cualquier archivo que tenga nuevas líneas en sus nombres, y es mucho más feo arrancar. ¿Hay una mejor manera?

Respuestas:


8

"No usar ls en scripts" es un problema con POSIX ls "solo"; para GNU ls ver --quoting-style=.

GNU sort resuelve el problema con --zero-terminated.

Si debe ser compatible, puede usarlo find ... -execpara pasar un nombre de archivo a la vez a un script que realiza el escape. Si al menos bash está disponible:

start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb

Ahh, --zero-terminatedgracias por eso, ¡desearía poder darte aún más puntos!
— evilsoup

... OK, estoy un poco confundido por info ls: si quisiera un script a prueba de balas con ls, ¿cuál --quoting-styledebería usar?
— evilsoup

@evilsoup Creo que --quoting-style=escapees la forma de elegir.
— Hauke ​​Laging

Ahora, para crear algunos archivos con nuevas líneas en sus nombres para probarlo: P
— evilsoup

1
Además: me encuentro con un caso extremo en el que GNU ls --quoting-stylefalla (para analizar a propósito) porque solo cita nombres de archivos: cuando tienes un espacio en el nombre de un grupo. Ok, es un caso muy extraño, pero aparece en cygwin bash shell, aquí tienes nombres de grupo como Domain Users.
— DavAlPi

4

La forma más fácil con diferencia es usar zsh. El calificador global clasifica om las coincidencias en orden cronológico inverso; uso Ompara orden cronológico.

for x in /path/to/dir/*(Nom); do …

El Ncalificador global hace que el patrón se expanda a una lista vacía si el directorio está vacío. Haga esto *(DNom)para que coincida con los archivos de puntos.


1
Dang, esta es la primera vez que me siento tentado a molestarme en mirar otros proyectiles, eso es muy agradable.
— evilsoup
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.