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.