Estou com dor de cabeça com isso. Estou tentando ordenar vários diretórios por um arquivo que está dentro deste diretório que contém a data de criação do backup.
Isto é para solicitar meus backups, não posso fazer isso com o ctime ou atime do diretório porque eles são copiados para outro host ao mesmo tempo.
Digamos que eu tenha a próxima estrutura:
/backups/full
/backups/incremental1
/backups/incremental2
/backups/incremental3
...
E dentro desses diretórios de backup, temos:
/backups/full/date.txt
/backups/incremental1/date.txt
/backups/incremental2/date.txt
..
E dentro desse date.txt
arquivo temos uma string como: creation_time = 2020-04-03 15:26:19
para cada um.
Como eu poderia fazer um script para ordenar esses diretórios pela string de tempo de criação e colocá-los em um array, para que eu pudesse fazer um
array=(full incremental1 incremental2 incremental3)
for dir in @{array[@]}; do
Eu gostaria que eles fossem ordenados dentro de uma variável ou array
Responder1
Supondo que a estrutura de date.txt
seja sempre a mesma e os nomes dos diretórios não contenham novas linhas, algo como isto deve resolver:
for d in /backups/*/date.txt; do
printf '%s\t%s\n' "$(grep creation_time "$d")" "$(basename "$(dirname "$d")")"
done | sort | cut -f2-
Saída:
full
incremental1
incremental2
incremental3
Como colocar isso em um array deve ser bastante fácil, mas provavelmente você não precisará disso, pois poderia alimentar o resultado, por exemplo, em um while
loop ou xargs
algo semelhante.
Responder2
Trabalhando com o carimbo de data/hora da última modificação dos date.txt
arquivos no 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
Isso usa um padrão global para corresponder a todos os date.txt
arquivos. O qualificador globbing no final do padrão classifica as correspondências para que a correspondência modificada mais recentemente seja a primeira (é isso que om
acontece) e remove a /date.txt
string do nome do caminho correspondente (como dirname
faria).
Obviamente, isso pressupõe que os date.txt
arquivos foram atualizados quando a data foi gravada no arquivo (mais ou menos na mesma hora em que o backup foi feito). Esse carimbo de data/hora (assim como os carimbos de data/hora do diretório) serão preservados se você copiar os dados 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'