Простий скрипт бекапу

Люди поділяються на 2 типи: ті що не роблять бекапи, і ті що вже роблять.


Свого часу в мене накрився мідним тазом жорсткий диск і з того часу я перейшов у другий тип людей. Але використовувати якусь графічну програму - це не цікаво, тому вирішив написати свій невеличкий скрипт, який буде вміти усе що мені необхідно і нічого лишнього.

Для початку визначимося яким саме методом будемо передавати дані. Якщо щоразу перекопійовувати з заміною усе, то це займатиме дууууже бугато часу й навантажуватиме дискову підсистему лишній раз. Тому необхідно перед копіюванням файлу перевірити чи він не був змінений з моменту останньої резервної копії. І щоб не винаходити велосипеда використаємо чудову утиліту rsync. Бонусом вона вміє копіювати дані як локально, так й через ssh і rsh.

Створимо наш sh-скрипт:
#!/bin/bash                                                 
SOURCE=$HOME                               # Звідки копіюємо
DEST="/media/user/HDD/.backup"             # куди (локально)
# DEST="user@192.168.0.1:/home/user/backup # і віддалено    
rsync -ahu --info=progress2 --partial --delete-during --delete-excluded --exclude-from=backup.exclude $SOURCE $DEST

Трішки про використані параметри:
-a - archive mode: рекурсивно, з копіюванням символічних посилань, прав доступу, часу модифікації, груп, власника,  файлів-пристроїв і спеціальних файлів;
-h - human-readable: показувати усі розміри в "людському" форматі :) ;
-u - update: пропускати, якщо в призначенні файл новіший ніж в джерелі;
--info=progress2 - показ поступу передачі (є інші варіанти);
--partial - залишати частково передані файли (під час наступної передачі їх почне передавати з місця зупинки)
--delete-during - видаляти застврілі файли під час передачі
--delete-excluded - видаляти файли, які містяться в списку ігнорованих
--exclude-from=backup.exclude - список ігнорованих файлів. Можна гнучко налаштувати, ось для прикладу мій файл:
- .*                  ігнорувати усі приховані файли
- *.vdi               ігнорувати усі .vdi-файли
- *.avi               ігнорувати усі .avi-файли
- *.mkv               ігнорувати усі .mkv-файли
- *.torrent           ігнорувати усі .torrent-файли
- *.iso               ігнорувати усі .iso-файли
- Programs/*          ігнорувати файли в папці Programs
+ Programs/Multiboot/ але в підпапці Multiboot не ігнорувати
- Videos/*            ігнорувати файли в папці Videos
- Downloads/*         ігнорувати файли в папці Downloads

На цьому можна було б завершити, але ігноровані файли хоч не надто важливі, проте непогано було б знати хоч їхні імена, щоб в разі втрати можна було швиденько завантажити із всесвітньої павутини. Для цього використаємо утиліту tree, яка генерує гарне дерево файлів:
TEMPDIR=$HOME/.temp-backup        # Тека для тимчасових файлів      
mkdir $TEMPDIR                    # створимо її                     
# Створимо тимчасові файли:                                         
PROG=$(mktemp --tmpdir=$TEMPDIR)  # для списку програм              
VIDEO=$(mktemp --tmpdir=$TEMPDIR) # відеофайлів                     
ALL=$(mktemp --tmpdir=$TEMPDIR)   # і усіх файлів (про всяк випадок)
# Збережемо дерева файлів:                                          
tree -inR -o $PROG --dirsfirst $SOURCE/Programs/                    
tree -inR -o $VIDEO --dirsfirst $SOURCE/Videos/                     
tree -hnRs -o $ALL --dirsfirst --du $SOURCE                         
# Скопіюємо їх в папку призначення (локально):                      
cp $PROG    $DEST/Programs.txt                                      
cp $VIDEO   $DEST/Videos.txt                                        
cp $ALL     $DEST/All.txt                                           
# # Скопіюємо по SSH:                                               
# sftp $DEST <<EOF                                                  
# put $ALL   All.txt                                                
# put $PROG  Programs.txt                                           
# put $SOUND Sounds.txt                                             
# put $VIDEO Videos.txt                                             
# EOF                                                               
rm -r $TEMPDIR                    # Видаляємо тимчасові файли        

Ось тепер можна повісити даний скрипт на cron, або ж запускати час від часу вручну і не переживати за свої дані ;)

Коментарі