Скрипт Bash для копирования и хранения 4-х резервных файлов (ежедневных, еженедельных, ежемесячных, раз в полгода) во втором каталоге

Вопрос или проблема

У меня есть приложение, которое делает автоматические ежедневные резервные копии в 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. Ниже приведен пример такого скрипта с комментариями к каждому шагу.

Шаги по созданию скрипта

  1. Создайте скрипт 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.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...