Вопрос или проблема
У меня есть приложение, которое делает автоматические ежедневные резервные копии в 11 вечера в директории dirA
. Каждая резервная копия — это один файл .tar, и у него, кажется, случайная схема именования, над которой у меня нет контроля (например, 129d3139.tar
, 4a98bb6b.tar
и т.д.).
Поскольку dirA
находится на носителе, у которого очень ограниченное пространство, я создал задачу cron через пять минут, в 11:05 вечера, которая удаляет все резервные копии, кроме самой последней. Скрипт bash “clear_old_backups.sh
” выглядит следующим образом и работает отлично (благодаря этому ответу):
#!/usr/bin/env bash
find /path/to/dirA/ -type f -printf '%T@\t%p\n' |
sort -t $'\t' -g |
head -n -1 |
cut -d $'\t' -f 2- |
xargs -r rm
Теперь я также хочу сохранить некоторые старые архивные резервные копии на другом более объемном носителе, в директории dirB
. В идеале, в dirB
у меня должно быть четыре файла:
1 день назад (просто прямое дублирование единственного файла, хранящегося в dirA
), затем дополнительно 1 неделю назад, 1 месяц назад и 6 месяцев назад.
Может кто-то помочь со скриптом bash, который скопирует и сохранит соответствующие файлы резервных копий?
Я не уверен, с чего начать — нужно ли мне как-то проверять гораздо чаще, достигло ли временное значение файла “сейчас минус 7 дней” и т.д.? И только тогда действовать соответственно?
ОС — Debian 12.
Ответ или решение
Для решения вашей задачи по созданию резервных копий и организации хранения их в другом каталоге с соблюдением расписания (ежедневно, еженедельно, ежемесячно и каждые шесть месяцев), вы можете написать Bash-скрипт, который будет запускаться через cron. Ниже приведен пример такого скрипта с комментариями к каждому шагу.
Шаги по созданию скрипта
- Создайте скрипт
backup_manager.sh
:
#!/usr/bin/env bash
# Определите директории
DIR_A="/path/to/dirA"
DIR_B="/path/to/dirB"
# Получите последний файл из dirA
latest_backup=$(ls -t "$DIR_A"/*.tar | head -n 1)
# Проверка на наличие резервной копии
if [[ -z "$latest_backup" ]]; then
echo "Нет доступных резервных копий для копирования."
exit 1
fi
# Копирование последних резервных копий в dirB
# 1. Дневная резервная копия
cp "$latest_backup" "$DIR_B/daily_backup.tar"
# 2. Еженедельная резервная копия
if (( $(find "$DIR_B" -maxdepth 1 -name 'weekly_backup.tar' -mtime +7 | wc -l) > 0 )); then
cp "$latest_backup" "$DIR_B/weekly_backup.tar"
fi
# 3. Ежемесячная резервная копия
if (( $(find "$DIR_B" -maxdepth 1 -name 'monthly_backup.tar' -mtime +30 | wc -l) > 0 )); then
cp "$latest_backup" "$DIR_B/monthly_backup.tar"
fi
# 4. Полугодовая резервная копия
if (( $(find "$DIR_B" -maxdepth 1 -name 'six_months_backup.tar' -mtime +180 | wc -l) > 0 )); then
cp "$latest_backup" "$DIR_B/six_months_backup.tar"
fi
echo "Резервные копии успешно созданы/обновлены в $DIR_B."
Объяснение скрипта
- Определение директорий: Укажите пути к вашим директориям
dirA
иdirB
. - Получение последнего файла: Используется команда
ls -t
для сортировки файлов по времени изменения, иhead -n 1
выбирает самый новый файл. - Копирование резервных копий:
- Ежедневная резервная копия: Последний файл копируется в
dirB/daily_backup.tar
. - Еженедельная, ежемесячная и полугодовая резервные копии: Проверяется, существуют ли старые резервные копии (которые были созданы 7, 30 и 180 дней назад). Если да, то новая копия заменяет старую.
- Ежедневная резервная копия: Последний файл копируется в
Настройка Cron
Чтобы автоматизировать выполнение данного скрипта, вы можете добавить его в cron. Запустите команду crontab -e
и добавьте следующую строку:
5 23 * * * /path/to/backup_manager.sh
Это будет запускать ваш скрипт каждый день в 23:05, сразу после выполнения clear_old_backups.sh
.
Заключение
С помощью этого скрипта вы сможете автоматизировать процесс создания резервных копий и поддерживать их в актуальном состоянии в новом каталоге. Убедитесь, что у вас есть необходимые права доступа для чтения и записи в обеих директориях.