пятница, 22 ноября 2019 г.

Проверка изменения содержания каталога через сравнение файлов в bash и выполнение различных действий в зависимости от полученного результата

Публикация содержит описание решения частной задачи автоматизации процесса резервирования данных в облачное хранилище.

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

Синхронизация с облаком реализована через сценарий (скрипт sh, скрипт bash) запуска rclone (подробности). 

Способ решения задачи выбран через сравнение содержания каталога, экспортируемого в файл, который будет сравниваться с аналогичным файлом "за вчера". Задача запускается ежедневно по расписанию (пользовательское задание cron).

Было принято решение экспорт содержания каталога производить через вывод дерева каталога в текстовый файл, для чего потребовалось установить в систему соответствующий инструмент, отсутствующий в стандартной поставке используемой мной Linux Mint:

sudo apt install -y tree

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

tree путь_к_каталогу > файл.txt

Сравнение файлов будет производиться через команду cmp, в результате которой сравнение файлов будет произведено побайтово с выводом статуса 0, если файлы идентичны; 1 если различаются (источник цитирования), например:

if cmp -s  file1  file2 ; then
  echo "Одинаковые"
else
  echo "Они такие разные!"
fi

В приводимом ниже примере сценария (скрипт sh, скрипт bash) назначение команд в котором поясняется после символа комментария # :

#!/bin/bash
# экспорт содержания "за вчера" (list old)
listo=/home/minter/Tools/scripts/temp/listo.txt
# экспорт содержания "за сегодня" (list new)
listn=/home/minter/Tools/scripts/temp/listn.txt
# каталог компьютера, подлежащий синхронизации
sm=/home/minter/FBbooks
# ресурс облака, в который производится синхронизация
# пояснения команд см. в описании команд rclone
dm=MEGA-3:fb2
tree $sm > $listn
if cmp -s $listo $listn; then
   # каталог не изменялся, синхронизация не нужна
   # никаких действий не производится
   :
else
   # синхронизировать каталог компьютера с облаком по правилу
   # "источник - получатель" (источником является компьютер)
   rclone sync $sm $dm
   # перезаписать файл содержания каталога "за вчера"
   # содержанием "за сегодня"
   cp $listn $listo
exit

В реальной эксплуатации вместо команды rclone sync $sm $dm мной используется сценарий синхронизации каталога на 2 различных облачных хранилища: Диск Яндекс и MEGA. Выполнение операций протоколируется с указанием времени. Кроме того, в отдельные файлы экспортируются данные о занятом и доступном дисковом пространстве каждого из облачных хранилищ (подробности).

Пример такого сценария:

#!/bin/bash
date=`date '+%d'`
acy=/home/minter/Clouds/rclone/Reports/$date.account-yd-libres.txt
acm=/home/minter/Clouds/rclone/Reports/$date.account-mega-3.txt
log=/home/minter/Clouds/rclone/Reports/$date.rclone-libres.txt
sm=/home/minter/FBbooks
dm1=Libres:FBbooks
dm2=MEGA-3:fb2
if [ -f $log ]; then
  :
else
  > $log
  time=`date '+%H-%M-%S'`
  echo "$time -- ebooks log created" >> $log
fi
echo "$time -- start yandex ebooks synchronization" >> $log
rclone sync $sm $dest1
echo "$time -- yandex ebooks synchronized" >> $log
echo "     " >> $acy
rclone about Libres: >> $acy
sleep 5
echo "$time -- start mega ebooks synchronization" >> $log
rclone sync $sm $dm2
echo "$time -- mega ebooks synchronized" >> $log
echo "     " >> $acm
rclone about MEGA-3: >> $acm
exit

Комментариев нет:

Отправить комментарий