trap "/bin/rm −f $inclist" EXIT
usageQuit()
{
··cat << "EOF" >&2
Usage: $0 [-o output] [-i|-f] [-n]
··-o lets you specify an alternative backup file/device,
··-i is an incremental, −f is a full backup, and −n prevents
··updating the timestamp when an incremental backup is done.
EOF
··exit 1
}
########## Основной сценарий ###########
while getopts "o: ifn" arg; do
··case "$opt" in
····o) output="$OPTARG";····;; # getopts автоматически изменяет OPTARG.
····i) btype="incremental";;;
····f) btype="full";········;;
····n) noinc=1;············;;
····?) usageQuit············;;
··esac
done
shift $(($OPTIND — 1))
echo "Doing $btype backup, saving output to $output"
timestamp="$(date +'%m%d%I%M')" # Получить текущие месяц, число, час, минуты.
································# Интересны форматы? "man strftime"
if ["$btype" = "incremental"]; then
··if [! -f $tsfile]; then
····echo "Error: can't do an incremental backup: no timestamp file" >&2
····exit 1
··fi
··find $HOME −depth −type f −newer $tsfile −user ${USER:-LOGNAME} | \
··failure="$?"
else
··find $HOME −depth −type f −user ${USER:-LOGNAME} | \
··failure="$?"
fi
if ["$noinc" = "0" −a "$failure" = "0"]; then
··touch −t $timestamp $tsfile
fi
exit 0
Как это работает
Собственно резервное копирование выполняется командой pax в строках
Между программами резервного копирования нет согласия по поводу того, какое время принимать за время создания резервной копии, но обычно им считается момент, когда копирование завершено, а не когда начато. Такой выбор может вызвать проблемы, если в процессе резервного копирования какие-то файлы изменятся, что вполне вероятно, так как резервное копирование порой длится довольно долго. Поскольку в этом случае момент последнего изменения файла окажется более ранним, чем момент, принятый за время создания резервной копии, такой файл может не попасть в следующую инкрементальную резервную копию, что само по себе плохо.
Но все не так просто, потому что выбирать момент времени,
Обеих проблем можно избежать, если сохранить дату и время перед началом резервного копирования (в переменной timestamp) и применить значение $timestamp к $tsfile, использовав для этого флаг −t в команде touch, только
Запуск сценария