Cómo obtener el archivo con marca de tiempo más reciente en BASH

Estoy escribiendo un script de implementación que guarda los archivos de copia de seguridad con marca de tiempo en un directorio de copias de seguridad. Me gustaría hacer una implementación de reversión que revertiría al archivo más reciente.

Mi directorio de copias de seguridad:

$:ls

.              1341094065_public_html_bu  1341094788_public_html_bu
..             1341094390_public_html_bu
1341093920_public_html_bu  1341094555_public_html_bu

Quiero identificar el archivo más reciente (por marca de tiempo en el nombre del archivo) en el directorio de copia de seguridad y guardar su nombre en una variable, luego copiarlo en ../public_html, y así sucesivamente...

preguntado el 30 de junio de 12 a las 23:06

Por favor mira BashFAQ / 003. -

4 Respuestas

ls -t ordenará los archivos por mtime. ls -t | head -n1 seleccionará el archivo más nuevo. Esto es independiente de cualquier esquema de nombres que tenga, lo que puede o no ser una ventaja.

Respondido el 30 de junio de 12 a las 23:06

... y una forma más "correcta", que no se romperá cuando los nombres de archivo contengan líneas nuevas, y tampoco cuando no haya archivos coincidentes (resultados globales no expandidos)

for newestfile in ./* ; do : ; done
if test -e "$newestfile"; then do something with "$newestfile" ; fi

Respondido 01 Jul 12, 01:07

El último nombre de archivo con marca de tiempo debe ordenarse alfabéticamente en último lugar. Entonces puedes usar tail -n1 para extraerlo.

Respondido el 30 de junio de 12 a las 23:06

Esto es exactamente lo que necesito en este caso. Gracias... extrañamente, esto no funciona: mostRecentBu=ls $buDir | tail -n1 El error es line 92: /srv/www/tmm.toomodernmedia.com/backups: is a directory - estrellas en mis bolsillos

@starsinmypockets: Su comando fallido dice: "Inicie el $buDir | tail -n1 comando, con el enlace variable mostRecentBu=ls añadido al medio ambiente. Debe adjuntar el comando completo (desde el = carácter en adelante) en backticks `...` o dólares-padres $(...) (eso se llama SUSTITUCIÓN DE MANDO). Aparte del hecho de que esto es una secuencia de comandos incorrecta, vea mi respuesta, que nunca fallará. - Jo tan

Para archivos que no tienen saltos de línea en sus nombres:

shopt -s nullglob
printf '%s\n' "$buDir"/* | tail -n 1

Respondido 01 Jul 12, 00:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.