Ниже приведён пошаговый разбор решения задачи и готовые примеры двух Bash-скриптов. В решении используется утилита zenity для отображения графических диалоговых окон, планировщик cron для автоматического запуска второго скрипта в полночь, а также команды find и zip для поиска изменённых файлов и создания архива.
ШАГ 1. Первый скрипт. Его задача – запросить у пользователя две папки (одну для отслеживания изменений, другую для хранения архивов), сохранить выбранные пути в конфигурационном файле и добавить задание в cron, запускающее второй скрипт каждый день в полночь.
• Для запроса папок испо...
WATCHIR=$(zenity --file-selection --directory --title=Выберите папку для отслеживания изменений)
if [ -z $WATCHIR ]; then
echo Папка для отслеживания не выбрана. Завершение работы.
exit 1
fi
ARCHIVEIR=$(zenity --file-selection --directory --title=Выберите папку для хранения архивов)
if [ -z $ARCHIVEIR ]; then
echo Папка для архивов не выбрана. Завершение работы.
exit 1
fi
CONFIGconfig.conf
echo WATCHDIR\ $CONFIGILE
echo ARCHIVEDIR\ $CONFIGILE
SECONDPATH=$(dirname $0)/secondcript.sh
(crontab -l 2/dev/null | grep -v $SECONDPATH; echo 0 0 * bash $SECONDPATH $CONFIGILE) | crontab -
echo Задача успешно установлена в планировщике cron.
Пояснения к первому скрипту:
- Сначала через zenity запрашиваются две папки.
- Если пользователь не выбрал хотя бы одну из них, скрипт завершается.
- Выбранные пути записываются в файл конфигурации, который позже будет прочитан вторым скриптом.
- Условная конструкция для crontab берёт имеющиеся задания и добавляет новую строку, которая по расписанию (0 0 *) выполняет второй скрипт, передавая в него путь к конфигу.
ШАГ 2. Второй скрипт. Его задача – при вызове через cron:
• Считать из переданного (или стандартного) конфигурационного файла переменные WATCHDIR.
• Произвести поиск файлов в WATCHIR, которые были изменены за последние 7 дней (используем команду find с опцией -mtime -7).
• Если такие файлы обнаружены, создать ZIP-архив с именем, содержащим текущую дату, и сохранить его в папку ARCHIVEIR.
• Затем из папки ARCHIVEIR удалить архивы старше 30 дней.
Ниже приведён пример кода второго скрипта (назовём его secondcript.sh):
#!/bin/bash
if [ -n $1 ]; then
CONFIGILE=$1
else
CONFIGconfig.conf
fi
if [ ! -f $CONFIGILE ]; then
echo Конфигурационный файл не найден: $CONFIGILE
exit 1
fi
source $CONFIGILE
if [ -z $WATCHDIR ]; then
echo Не заданы значения WATCHDIR в конфигурационном файле.
exit 1
fi
DATE=$(date +%Y-%m-%d)
ARCHIVEDIR/backup_$DATE.zip
CHANGEDDIR -type f -mtime -7)
if [ -z $CHANGEDILES ]; then
echo За последние 7 дней изменений не обнаружено.
else
Создаём ZIP-архив с найденными файлами. Опция -j используется для исключения путей к файлам внутри архива.
Используем find и xargs с нулевым разделителем для корректной обработки имён с пробелами.
find $WATCHFILE
echo Создан архив: $ARCHIVEILE
fi
find $ARCHIVEIR -name *.zip -mtime +30 -exec rm {}
echo Старые архивы (старше 30 дней) удалены.
Пояснения ко второму скрипту:
- Скрипт проверяет, передан ли конфигурационный файл через аргумент командной строки, и считывает из него значения WATCHDIR.
- Команда find ищет файлы, изменённые менее чем 7 дней назад (-mtime -7). Если таких файлов нет, выводится сообщение об отсутствии изменений.
- Если файлы обнаружены, с помощью find с опцией -print0 и xargs -0 создаётся ZIP-архив. Опция -j у zip позволяет записать файлы без сохранения иерархии каталогов.
- Затем с помощью find удаляются архивы в папке ARCHIVEIR, которым более 30 дней (-mtime +30).
Таким образом, первый скрипт позволяет настроить параметры и установить задание в планировщике, а второй скрипт выполняет архивирование изменённых файлов и очистку старых архивов.
Эти два скрипта в совокупности решают поставленную задачу.