Automatyczna kopia bezpieczeństwa

Podziel się z innymi!

    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 🙂

    Podziel się z innymi!