Упорядочить каталог по строке даты файла внутри этого каталога

Упорядочить каталог по строке даты файла внутри этого каталога

У меня с этим голова болит. Я пытаюсь упорядочить ряд каталогов по файлу, который находится в этом каталоге и содержит дату создания резервной копии.

Это нужно для упорядочивания моих резервных копий. Я не могу сделать это с ctime или atime каталога, потому что они одновременно копируются на другой хост.

Допустим, у меня есть следующая структура:

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

А внутри этих резервных каталогов у нас есть:

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

И внутри этого date.txtфайла у нас есть строка вида: creation_time = 2020-04-03 15:26:19для каждого из них.

Как мне создать скрипт, который упорядочит эти каталоги по строке creation_time и поместит их в массив, чтобы я мог сделать

array=(full incremental1 incremental2 incremental3)

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

Я бы хотел, чтобы они были упорядочены внутри переменной или массива.

решение1

Если предположить, что структура date.txtвсегда одинакова и имена каталогов не содержат символов новой строки, то должно подойти что-то вроде этого:

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

Выход:

full
incremental1
incremental2
incremental3

Поместить это в массив должно быть довольно просто, но, вероятно, вам это не понадобится, поскольку вы можете передать результат, например, в whileцикл или xargsчто-то в этом роде.

решение2

Работа с меткой времени последнего изменения файлов date.txtв zshоболочке:

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

Это использует шаблон подстановки для сопоставления всех date.txtфайлов. Квалификатор подстановки в конце шаблона сортирует совпадения так, что последнее измененное совпадение оказывается первым (это то, что omделает), и удаляет /date.txtстроку из совпадающего имени пути (так dirnameбы и было).

Это, очевидно, предполагает, что date.txtфайлы были обновлены, когда дата была записана в файл (примерно в то же время, когда была сделана резервная копия). Эта временная метка (а также временные метки каталога) сохранится, если вы скопируете данные с помощью rsync --archive.

От 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'

Связанный контент