Резервные копии из папок. Хранение бэкапов

Часто простые домашние пользователи хранят данные на единственном диске, в одном экземпляре. Это неоправданно рискованно: если носитель станет нечитаемым, то информация будет безвозвратно утеряна. Поэтому стоит делать бэкапы хотя бы самых важных папок. У меня есть довольно быстрый и удобный способ делать бэкапы.

Раз в несколько месяцев я делаю бэкапы данных. Причём сохраняю бэкапы на стороннем носителе, а не на том, на котором находятся первоисточники. Все данные я разделяю на папки по их принадлежности и архивирую с указанием даты создания в имени файла.

Раньше я делал бэкапы вручную. Но решил автоматизировать процесс из-за большого количества папок и однотипности действий. К примеру, есть у меня набор папок, в которых хранятся данные моих сайтов (исходники, файлы, наработки и т.п.). Все данные организованы в отдельные папки, которые называются как сайты:

Папки

Чтобы сделать бэкап, создаю папку «backup» на отдельном носителе и делаю туда архивирование каждой папки. В названия архивов ставлю дату в формате «ГГГГММДД», чтобы была возможность сортировки по возрастанию/убыванию даты через имя файла. Организация сохранённых бэкапов получается такой:

Архивы

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

Автоматизация бэкапов

Очевидно, что это однотипная работа. А следовательно, её можно запрограммировать. В качестве операционной системы я использую Linux Mint, поэтому решил сделать скрипт на bash. Он запустится на подавляющем большинстве дестрибутивов, потому что не использует какие-либо особо изощрённые функции.

Попробуем сделать такой скрипт. Для этого переходим туда, где лежат папки, содержимое которых надо забэкапить. Создаём файлик «MakeBackup.sh»:

Файл скрипта

Файлу «MakeBackup.sh» даём права на исполнение и пишем внутрь файла:

for i in *

do

    if [ -d "$i" ]; then

        if [ "$(ls -A $i)" ]; then

            mkdir -p "backup/$i/"

            tar zcf "backup/$i/$(date +%Y%m%d).tar.gz" "$i"

            echo "$i archived"

        else

            echo "$i ERROR"

        fi

    fi

done

echo DONE;

Если разобрать скрипт подробнее, то можно заметить, что в нём только две команды: mkdir и tar. Первая «mkdir» создаёт папку для архива, а ключ «-p» заставляет проверять создана ли папка «backup». Вторая команда «tar» делает архив и сжимает его через gzip.

Теперь попробуем запустить этот bash скрипт. Он выдаст в терминал список обработанных папок:

site1.ru archived

site2.ru archived

site3.ru archived

DONE

В процессе работы скрипта создалась папка «backup», а в ней сохранены бэкапы:

Файлы бэкапов

Остаётся только перенести эту папку «backup» в хранилище. Там она объединиться с уже существующей папкой «backup» со всеми старыми архивами. В хранилище получится такая организация:

Хранилище бэкапов

P.S.

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



2020-02-29T12:40:45
Программирование