Automatyczna kopia bezpieczeństwa

Bezpieczeństwo danych to sprawa kluczowa. Jednym z ważniejszych zabiegów jest systematyczne tworzenie kopii bezpieczeństwa czyli tzw. backup. W ramach ćwiczeń w bashu postanowiłem napisać sobie taki mały skrypcik, który po odpaleniu przekopiuje cały katalog domowy mojego użytkownika na zewnętrzny dysk USB.

#!/bin/sh
 
#ustawienia sciezek
DEST_PATH="/path/to/my/external/disk"
BACKUP_DIR=$DEST_PATH/$(date +%Y-%m-%d-%H:%M)
SOURCE_PATH="/home/myuser"
 
#ustawienia domyslne
MODE="full"
TYPE="tar"
 
#wyswietlenie informacji jezeli bedzie mniej niz 2 argumenty.
if [ $# -lt 2 ]; then
    echo "Usage: `basename $0` <TAR|COPY> <FULL|incremental X days ago>"
fi
 
#jezeli podany jest drugi argument w linii polecen, to przystap do analizy
if [ ! -z "$2" ]; then
    case "$2" in
        FULL|full)
            MODE=full
            ;;
        *)
            MODE=$2
            ;;
    esac
fi
 
#jezeli pierwszy argument nie jest pusty do nalezy go przeanalizowac
if [ ! -z "$1" ]; then
    case "$1" in
        TAR|tar)
            TYPE=tar
            ;;
        copy|COPY)
            TYPE=copy
            ;;
    esac
fi
 
#jezeli katalog docelowy backupu nie istnieje, to nalezy go stworzyc
if [ ! -e $BACKUP_DIR ]; then
    mkdir -p $BACKUP_DIR;
fi
 
#funkcja robiaca backup za pomoca tara
make_tar_backup ()
{
    if [ "$MODE" = "full" ]; then
        echo "Full backup as archive TAR"
        tar -zcp -f $BACKUP_DIR/full.tgz $SOURCE_PATH
    else
        echo "Incremental backup as archive TAR. $MODE days ago"
        tar -zcp --newer-mtime "$MODE days ago" -f $BACKUP_DIR/incremental_$MODE.tgz $SOURCE_PATH
    fi
}
 
#funkcja robiaca backup za pomoca cp
make_copy_backup ()
{
    if [ "$MODE" = "full" ]; then
        echo "Full backup as save copy"
        for source_files in $SOURCE_PATH; do
            echo -e "\tDirectory $source_files"
            cp --parents -a $source_files $BACKUP_DIR
        done
    else
        echo "Incremental backup as save copy. $MODE days ago"
        for s in $SOURCE_PATH; do
            items_list=`find $s -ctime -$MODE`
            echo -e "\tDirectory $s"
            if [ ! -z "$items_list" ]; then
                for item_file in $lista; do
                    cp --parents -a $item_file $BACKUP_DIR
                done
            fi
        done
    fi
}
 
#start pomiaru czasu
time_start=$(date +%s);
 
#w zaleznosci od sposobu przechowywania backupu, uruchamiamy odpowiednie funkcje.
case "$TYPE" in
   tar)
      make_tar_backup
      ;;
   copy)
      make_copy_backup
      ;;
esac
 
time_end=$(date +%s);
exec_time=`expr $time_end - $time_start`
echo "Backup successfull. Execution time $exec_time seconds"

Proste ale działa 🙂