У меня с этим голова болит. Я пытаюсь упорядочить ряд каталогов по файлу, который находится в этом каталоге и содержит дату создания резервной копии.
Это нужно для упорядочивания моих резервных копий. Я не могу сделать это с 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'