Ordene o diretório por uma sequência de datas de um arquivo dentro deste diretório

Ordene o diretório por uma sequência de datas de um arquivo dentro deste diretório

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.txtarquivo temos uma string como: creation_time = 2020-04-03 15:26:19para 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.txtseja 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 whileloop ou xargsalgo semelhante.

Responder2

Trabalhando com o carimbo de data/hora da última modificação dos date.txtarquivos no 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

Isso usa um padrão global para corresponder a todos os date.txtarquivos. 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 omacontece) e remove a /date.txtstring do nome do caminho correspondente (como dirnamefaria).

Obviamente, isso pressupõe que os date.txtarquivos 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'

informação relacionada