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.txt
archivo tenemos una cadena como: creation_time = 2020-04-03 15:26:19
para 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.txt
es 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 while
bucle o xargs
similar.
Respuesta2
Trabajar con la marca de tiempo de la última modificación de los date.txt
archivos en el zsh
shell:
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.txt
archivos. 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 om
hace) y elimina la /date.txt
cadena del nombre de ruta coincidente (como dirname
haría).
Obviamente, esto supone que los date.txt
archivos 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'