Сегодня заметил, что при таинственных обстоятельствах изменился конфиг какуна, который я писал пол ночи, помимо этого часто экспериментирую с конфигом nixos, окончательно созрев, передо мной встала задача организовать простое резервное копирование конфигов и своих исходников, путём отправки пути к файлу или каталогу в файл из которого автоматизированно будет это резервное копирование и совершаться. Помимо этого дерево диффов позволяет отследить время изменения каждого из файлов, интервал в 3 часа, думаю, сильно упростит поиск по логам. Я накидал скрипт, но с bash особо не знаком, прошу указать на ошибки, которые могут привести к ошибкам копирования, хочется рулить только списком и спасть спокойно. Заранее спасибо.
#checking PID
PID_FILE="./sync.pid"
if [ -f "$PID_FILE" ] && kill -0 `cat "$PID_FILE"` 2> /dev/null && ps -p `cat "$PID_FILE"` -o cmd | grep `basename $0`
then
exit 1
else
echo $$ > "$PID_FILE"
fi
#dir for backup process
mkdir "$1" 2> /dev/null
#archive name
name=`date +%H_%j_%y`
#first path backup dir
#second file with list synced files, one on line
if [ $# -ne 2 ]; then
echo "err"
exit 1
fi
#mount /dev/sda5 "$1"
cd "$1"
#actual synced files
mkdir sync 2> /dev/null
#archives of diffs
mkdir archives 2> /dev/null
#lists of synced files and logs
mkdir lists 2> /dev/null
#tree of diffs
mkdir diffs 2> /dev/null
#retrive list of synced files
rsync --progress -c -a -n --files-from="$2" / ./sync/ > "./$name.tmp"
tail -n +3 "./$name.tmp" > "./lists/$name.list" && rm "./$name.tmp"
#count synced files
count=$(grep -v '/$' "./lists/$name.list" | wc -l)
#skip if no files need to sync
if [ "$count" -gt 0 ]; then
#temp dir
mkdir "./$name" 2> "./lists/$name.log"
while IFS='' read -r line || [[ -n "$line" ]]; do
if [ -f "./sync/$line" ]; then
mkdir -p "./$name/$line" 2>> "./lists/$name.log"
#dir for diff named by full path and name of changed file
mkdir -p "./diffs/$line" 2>> /dev/null
#make diff file
diff "/$line" "./sync/$line" > "./$name/$line/$name.diff"
#copy from temp to diff tree
cp "./$name/$line/$name.diff" "./diffs/$line/$name.diff" 2>> "./lists/$name.log"
fi
done < "./lists/$name.list"
#make archive with current diffs
tar -zcf "./archives/$name.tar.gz" "./$name" 2>> "./lists/$name.log"
#put to mega.nz
megaput --path=/Root/one --no-progress "./archives/$name.tar.gz" 2>> "./lists/$name.log"
#remove temp dir
rm -r "./$name" 2>> "./lists/$name.log"
fi
#real sync
rsync -q -c -a --files-from="$2" / ./sync/ 2>> "./lists/$name.log"
#if monday create full archive and put to mega
if [[ `date +%u%H%M` < 10300 ]]; then
tar -zcf "./archives/weekly_$name.tar.gz" ./sync 2>> "./lists/$name.log"
megaput --path=/Root/one --no-progress "./archives/weekly_$name.tar.gz" 2>> "./lists/$name.log"
fi
#umount "$1"
rm "$PID_FILE"
echo "$count"
exit 0
PS Скрипт будет запускаться раз в 3 часа. Что недельный бэкап может не случиться я вкурсе, подскажите как правильно. Плюсом хочу в этом скрипте монтировать отдельный раздел в /bu вначале и размонтировать вконце, чтобы в промежутках никто не мог туда писать, но пока свободного раздела для тестов нет.
PPS Возможно данная тема будет полезна не только лишь мне.