Ordenar directorio por una cadena de fecha de un archivo dentro de este directorio

Ordenar directorio por una cadena de fecha de un archivo dentro de este directorio

Me duele la cabeza con esto. Estoy intentando ordenar varios directorios por un archivo que se encuentra dentro de este directorio y que contiene la fecha de creación de la copia de seguridad.

Esto es para ordenar mis copias de seguridad, no puedo hacer esto con el ctime o atime del directorio porque se copian a otro host al mismo tiempo.

Digamos que tengo la siguiente estructura:

/backups/full
/backups/incremental1
/backups/incremental2
/backups/incremental3
...

Y dentro de esos directorios de respaldo, tenemos:

/backups/full/date.txt
/backups/incremental1/date.txt
/backups/incremental2/date.txt
..

Y dentro de ese date.txtarchivo tenemos una cadena como: creation_time = 2020-04-03 15:26:19para cada uno.

¿Cómo podría crear un script para ordenar estos directorios por su cadena de tiempo de creación y colocarlos en una matriz, para poder hacer un

array=(full incremental1 incremental2 incremental3)

for dir in @{array[@]}; do

Me gustaría tenerlos ordenados dentro de una variable o un array.

Respuesta1

Suponiendo que la estructura de date.txtes siempre la misma y que los nombres de los directorios no contienen nuevas líneas, algo como esto debería funcionar:

for d in /backups/*/date.txt; do
    printf '%s\t%s\n' "$(grep creation_time "$d")" "$(basename "$(dirname "$d")")"
done | sort | cut -f2-

Producción:

full
incremental1
incremental2
incremental3

Cómo poner esto en una matriz debería ser bastante fácil, pero probablemente no lo necesite, ya que podría introducir el resultado, por ejemplo, en un whilebucle o xargssimilar.

Respuesta2

Trabajar con la marca de tiempo de la última modificación de los date.txtarchivos en el zshshell:

for backupdir in /backup/*/date.txt(ome['REPLY=$REPLY:h']); do
    # do whatever you need to do
    # with the directory path in $backupdir
done

Esto utiliza un patrón global para hacer coincidir todos los date.txtarchivos. El calificador global al final del patrón ordena las coincidencias para que la coincidencia modificada más recientemente sea la primera (esto es lo que omhace) y elimina la /date.txtcadena del nombre de ruta coincidente (como dirnameharía).

Obviamente, esto supone que los date.txtarchivos se actualizaron cuando se escribió la fecha en el archivo (aproximadamente al mismo tiempo que se realizó la copia de seguridad). Esta marca de tiempo (así como las marcas de tiempo del directorio) se conservarán si copia los datos usando rsync --archive.

De bash:

zsh -c '
for backupdir in /backup/*/date.txt(ome['\''REPLY=$REPLY:h'\'']); do
    # do whatever you need to do
    # with the directory path in $backupdir
done'

información relacionada