Этот сценарий имеет несколько параметров, которые можно игнорировать, чтобы выполнить инкрементальное резервное копирование по умолчанию файлов, изменившихся с момента предыдущего запуска сценария (то есть после отметки времени, зафиксированной при предыдущем инкрементальном резервном копировании). Начальные параметры позволяют указать другой файл или устройство для вывода (-o output), выбрать создание полной резервной копии (-f), явно выбрать создание инкрементальной резервной копии (-i), даже при том, что этот режим предполагается по умолчанию, или предотвратить обновление файла, играющего роль отметки времени, при инкрементальном резервном копировании (-n).
Результаты
Сценарий backup не имеет обязательных аргументов и может запускаться простой командой, как показано в листинге 6.17.
Листинг 6.17. Сценарий backup не имеет обязательных аргументов и выводит результаты работы на экран
$ backup
Doing incremental backup, saving output to /tmp/backup.140703.bz2
Вывод программы резервного копирования вполне ожидаемо не блещет подробностями. Зато в результате получается сжатый файл существенного размера, что свидетельствует о большом объеме данных, хранящихся внутри, как можно видеть в листинге 6.18.
Листинг 6.18. Вывод информации о файле с резервной копией с помощью команды ls
$ ls −l /tmp/backup*
-rw-r-r- 1 taylor wheel 621739008 Jul 14 07:31 backup.140703.bz2
№ 52. Резервное копирование каталогов
Другая похожая задача — создание копий отдельных каталогов или деревьев каталогов, ориентированная на пользователей. Простой сценарий в листинге 6.19 дает им возможность создать сжатый tar-архив выбранного каталога для сохранения в виде резервной копии или передачи другим пользователям.
Код
Листинг 6.19. Сценарий archivedir
··#!/bin/bash
··# archivedir — создает сжатый архив заданного каталога.
··maxarchivedir=10········# Размер большого каталога в блоках.
··compress=gzip·········· # Измените, если предпочитаете другую программу сжатия.
··progname=$(basename $0) # Улучшенный формат вывода для сообщений об ошибках.
··if [$# −eq 0]; then # Нет аргументов? Это проблема.
····echo "Usage: $progname directory" >&2
····exit 1
··fi
··if [! -d $1]; then
····echo "${progname}: can't find directory $1 to archive." >&2
····exit 1
··fi
··if ["$(basename $1)"!= "$1" −o "$1" = "."]; then
····echo "${progname}: You must specify a subdirectory" >&2
····exit 1
··fi
····echo "${progname}: cannot write archive file to current directory." >&2
····exit 1
··fi
··# Архив может получиться опасно большим? Давайте проверим…
··dirsize="$(du −s $1 | awk '{print $1}')"
··if [$dirsize −gt $maxarchivedir]; then
····/bin/echo −n "Warning: directory $1 is $dirsize blocks. Proceed? [n] "
····read answer
····answer="$(echo $answer | tr '[: upper: ]' '[: lower: ]' | cut −c1)"
····if ["$answer"!= "y"]; then
······echo "${progname}: archive of directory $1 canceled." >&2
······exit 0
····fi
··fi
··archivename="$1.tgz"
··if
····echo "Directory $1 archived as $archivename"
··else
····echo "Warning: tar encountered errors archiving $1"
··fi
··exit 0
Как это работает