Bash Советы - Bash Scripting | Linux Terminal & Shell. Скрипты и Автоматизация задач. Командная строка для Sysadmin и DevOps. Уроки Баш, Zsh и CLI Tools. Unix Console.
IT и технологии · 3 февраля 2026 г.
Сегодня я хочу поделиться простым, но очень полезным Bash-скриптом для автоматического ... — 3 февраля 2026 г. в 08:16:44.483
Сегодня я хочу поделиться простым, но очень полезным Bash-скриптом для автоматического резервного копирования директорий с ротацией старых бэкапов. Такой скрипт пригодится, если необходимо сохранять копии важных данных и при этом не засорять диск старыми архивами. 🔄 Скрипт: Backup с ротацией #!/usr/bin/env bash # ================================ # Скрипт: backup_rotate.sh # Автор: https://t.me/bash_srv # Описание: Создаёт архив указанной директории, # хранит только последние N бэкапов, удаляя старые. # ================================ # Настройки SOURCE_DIR="/var/www/my_project" # Директория, которую резервируем DEST_DIR="/backups/my_project" # Директория для хранения бэкапов RETENTION_DAYS=7 # Сколько дней хранить бэкапы # Текущее время для имени архива DATE=$(date +"%Y-%m-%d_%H-%M-%S") ARCHIVE_NAME="backup_${DATE}.tar.gz" # Проверяем, что исходная директория существует if [[ ! -d "$SOURCE_DIR" ]]; then echo "❌ Исходная директория $SOURCE_DIR не найдена!" exit 1 fi # Создаём директорию назначения, если её нет mkdir -p "$DEST_DIR" # Создаём архив tar -czf "${DEST_DIR}/${ARCHIVE_NAME}" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")" if [[ $? -eq 0 ]]; then echo "✅ Создан бэкап: ${DEST_DIR}/${ARCHIVE_NAME}" else echo "❌ Ошибка при создании архива!" exit 1 fi # Удаляем старые бэкапы старше RETENTION_DAYS find "$DEST_DIR" -type f -name "backup_*.tar.gz" -mtime +${RETENTION_DAYS} -print -delete echo "🗑️ Удалены бэкапы старше ${RETENTION_DAYS} дней." exit 0 📝 Пояснение к скрипту 1. Настройки переменных: 🔹 SOURCE_DIR — путь к директории, которую нужно сохранить (например, веб-проект, база данных и т.д.). 🔹 DEST_DIR — куда складываем архива (может быть локальная папка или смонтированный удалённый диск). 🔹 RETENTION_DAYS — сколько дней хранить бэкапы. Всё, что старше этого значения, будет удаляться автоматически. 2. Скрипт проверяет, существует ли исходная директория. Если нет — выводит ошибку и завершает работу. 3. Создаётся папка назначения (mkdir -p), чтобы избежать ошибок, если её ещё нет. 4. Делается tar.gz - архив директории, причём для удобства используется команда: tar -czf ${DEST_DIR}/${ARCHIVE_NAME} -C $(dirname $SOURCE_DIR) $(basename $SOURCE_DIR) - Это позволяет не копировать весь путь в архив, а только нужную папку. 5. Если архивирование прошло успешно (код возврата 0) — выводим сообщение об успехе. 6. Далее команда find ищет файлы-архивы старше RETENTION_DAYS дней и удаляет их. Параметр -mtime +N означает “более N дней назад”. Опция -print -delete сначала покажет, что удаляется, а потом удалит. 7. В конце скрипт выводит, сколько старых бэкапов удалено, и завершает работу. 📌 Как использовать 1. Скопируйте скрипт в файл, например: sudo nano /usr/local/bin/backup_rotate.sh 2. Сделайте его исполняемым: sudo chmod +x /usr/local/bin/backup_rotate.sh 3. Отредактируйте переменные в начале скрипта под свои нужды: SOURCE_DIR="/path/to/your/data" DEST_DIR="/path/to/backup/location" RETENTION_DAYS=7 4. Запустите вручную, чтобы протестировать: /usr/local/bin/backup_rotate.sh 5. Если всё работает как надо, добавьте задание в ``````bash crontab``````bash для автоматического запуска. Например, чтобы делать бэкап каждый день в 3:00: sudo crontab -e И добавить строку: 0 3 * * * /usr/local/bin/backup_rotate.sh >> /var/log/backup_rotate.log 2>&1 Здесь мы также перенаправляем вывод в лог-файл, чтобы отслеживать успешные и неуспешные запуски. 📜 👉 @bash_srv

