Условие:
Написать 2 скрипта c помощью Bash-скриптов для оболочки Bash:
Первый скрипт запрашивает у пользователя две папки(с помощью всплывающих окон): одну для отслеживания изменений, другую для хранения архивов. Затем он создает задание в планировщике задач, которое будет запускать второй скрипт каждый день в полночь.
Второй скрипт, когда его вызывает планировщик задач, выполняет следующие шаги:
Сканирует указанные пользователем папки на наличие файлов, которые были изменены за последние семь дней.
Если такие файлы найдены, они архивируются в ZIP-файл с текущей датой.
Старые архивы (старше 30 дней) удаляются из папки хранения архивов.
Решение:
Ниже приведён пошаговый разбор решения задачи и готовые примеры двух 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. ------------------------------------------------------------ Пояснения к первому скрипту: 1) Сначала через zenity запрашиваются две папки. 2) Если пользователь не выбрал хотя бы одну из них, скрипт завершается. 3) Выбранные пути записываются в файл конфигурации, который позже будет прочитан вторым скриптом. 4) Условная конструкция для 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 дней) удалены. ------------------------------------------------------------ Пояснения ко второму скрипту: 1) Скрипт проверяет, передан ли конфигурационный файл через аргумент командной строки, и считывает из него значения WATCHDIR. 2) Команда find ищет файлы, изменённые менее чем 7 дней назад (-mtime -7). Если таких файлов нет, выводится сообщение об отсутствии изменений. 3) Если файлы обнаружены, с помощью find с опцией -print0 и xargs -0 создаётся ZIP-архив. Опция -j у zip позволяет записать файлы без сохранения иерархии каталогов. 4) Затем с помощью find удаляются архивы в папке ARCHIVEIR, которым более 30 дней (-mtime +30). Таким образом, первый скрипт позволяет настроить параметры и установить задание в планировщике, а второй скрипт выполняет архивирование изменённых файлов и очистку старых архивов. Эти два скрипта в совокупности решают поставленную задачу.