Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/04/2012, à 11:14

brisco

[Script] sauvegarder ses fichiers sur un disque externe avec rsync

Bonjour
voici un script que j'utilise pour sauvegarder mes fichiers.
Le script est basé sur rsync

Au premier lancement, il vous pose des questions (dossiers à sauvegarder, destination..), et consigne tout cela dans un fichier
de configuration situé dans votre homedir ($HOME/.backupme/backupme.cfg)
Chez moi ce fichier ressemble à ça :

#mode de sauvegarde
#MODE=compress

#A sauver (ex: SAVE=/home/brice...). Utiliser une ligne SAVE par répertoire source
SAVE=/home/brice
SAVE=/etc

#Destination (ex: DEST=...)
DEST=/media/MyPassport/save/ubuntu

#Dossiers à exclure (ex: EXDR=/home/brice/musique...). Utiliser une ligne EXDR par dossier à exclure
EXDR=/home/brice/Musique
EXDR=/home/brice/Téléchargements
EXDR=/home/brice/jeux
EXDR=/home/brice/sauveUSB
EXDR=/home/brice/Vidéos
EXDR=/home/brice/.wine
EXDR=/home/brice/.wine-prefix

#Types de fichiers à exclure (noms séparés par un espace ex: *.avi *.mp3)
EXTP=mp3,iso

Lorsque vous lancez le script, il vous rappelle la configuration choisie :

brice@brice-desktop:~$ backupme 

CONFIGURATION ACTUELLE:

SAVE=/home/brice
SAVE=/etc

DEST=/media/MyPassport/save/ubuntu

EXDR=/home/brice/Musique
EXDR=/home/brice/Téléchargements
EXDR=/home/brice/jeux
EXDR=/home/brice/sauveUSB
EXDR=/home/brice/Vidéos
EXDR=/home/brice/.wine
EXDR=/home/brice/.wine-prefix

EXTP=mp3,iso

Lancer la sauvegarde ?(o/n):

Et voici le code du script :

#!/bin/bash
# ' ----------------------------------------------------------------------------------------------
# '  OBJET         :  sauvegarde
# '                     
# '                  
# '   Version       Date        Auteur     Objet
# ' --------------------------------------------------------------------------------------------
# '   V1          19/10/11      BMAU       Creation
# '      V2        20/10/11    BMAU       IHM pour generer un fichier de configuration
# '      V3        07/11/11    BMAU       Prise en compte des dossiers a exclure 
# '      V4        15/11/11    BMAU       Prise en compte de NTFS                        

#set -x
#IFS="%"
TITRE="BackupMe"
VERSION="V4"
CHLOG="resultat_backup.log"
REPCONF="$HOME/.backupme"
CHCFG="$REPCONF/backupme.cfg"
#formatage de la date en YYYYmmdd
sdate=`date +%Y%m%d`

#formatage de l'heure en HHmm
sheure=`date +%H%M%S`

#####FUNCTION##################################################################
###############################################################################
#R?p?r le nom du repertoire d'un chemin passe en param
GetRepName() {
    local tmp=`echo $1 | awk -F "/" '{print $NF}'`
    if [ -z "$tmp" ];then
        tmp=`echo $1 | awk -F "/" '{print $(NF-1)}'`    
    fi
    echo "$tmp"
}

#tronquer la chaine $1 avec la chaine $2
#si la chaine $1 commence par la chaine $2
TroncChem() {
    local tmp=`echo "$1" | awk -F "$2" '{print $2}'`                    

    if echo "$1" | egrep "^$2" 1> /dev/null;then 
        echo "$tmp"
    fi
}

#tester si une commande
TestCmde() {
    if which $1 &> /dev/null  ;then
        return 0
    else 
        return 1
    fi
}

#Renvoie le type de système de fichier du répertoire passé en param.
TestFileSystem() {
    local tmp=`df -T $1 | awk 'END {print $2}'`
    echo $tmp
}

#creer un fichier de configuration
#param: un fichier
GenerConf() {
    local tabrep
    local dest
    local i=0
    
    while true; do
        echo -n "Repertoire a sauvegarder:"
        read tabrep[$i]
        echo ''
        echo -n "Sauvegarder un autre repertoire ?(o/n):"
        read continue
        
        if [ "$continue" == "n" ]; then
            break
        else
            ((i++))
        fi
    done
    
    echo ''
    echo -n "Repertoire de destination:"
    read dest
    echo ''
    echo '##mode de sauvegarde' > $1
    echo '#MODE=compress' >> $1
    echo '' >> $1
    echo "#A sauver (ex: SAVE=$HOME...). Utiliser une ligne SAVE par répertoire source" >> $1
    for ((i=0 ; i < ${#tabrep[*]} ; i++)); do
        echo "SAVE=${tabrep[$i]}" >> $1
    done
    echo '' >> $1
    echo '#Destination (ex: DEST=...)' >> $1
    echo "DEST=$dest" >> $1
    echo '' >> $1
    echo "#Dossiers à exclure (ex: EXDR=$HOME/musique...). Utiliser une ligne EXDR par dossier à exclure" >> $1
    echo "#EXDR=$HOME/musique" >> $1
    echo '' >> $1
    echo '#Types de fichiers à exclure (noms séparés par un espace ex: *.avi *.mp3)' >> $1
    echo '#EXTP=avi,mp3,wma,mov' >> $1
    echo '' >> $1
    
}

LireConf() {
    while read line ; do
        if [ "${line:0:1}" != "#" ]; then
            echo "$line"
        fi
    done < $1
}
######MAIN######################################################################
################################################################################

#test de la commande rsync 
if ! TestCmde rsync ; then
    echo "commande rsync non trouve"
    exit 1
fi

#test et creation repconf
if [ ! -e $REPCONF ];then
    mkdir $REPCONF
fi

#creation d'un fichier de configuration
if [ ! -e $CHCFG ];then
    GenerConf $CHCFG
fi

#lecture du fichier de configuration
if [ -e $CHCFG ];then
    echo ''
    echo "CONFIGURATION ACTUELLE:" 
    LireConf $CHCFG
    echo -n "Lancer la sauvegarde ?(o/n):"
    read continue
        
        if [ "$continue" == "n" ]; then
            exit 0
        fi
fi



i=0
k=0
while read line; do
    if [ "${line:0:1}" != "#" ]; then

        case "${line:0:4}" in
            "MODE")
                mode=`echo $line | awk -F "=" '{print $NF}'`;;
            
            "SAVE")
                tabsave[$i]=`echo $line | awk -F "=" '{print $NF}'`                
                ((i++));;    
            
            "DEST")
                dest=`echo $line | awk -F "=" '{print $NF}'`;;        
            
            "EXDR")
                tabexdir[$k]=`echo $line | awk -F "=" '{print $NF}'`
                ((k++));;
                
            "EXTP")
                extyp=`echo $line | awk -F "=" '{print $NF}'`;;
        esac


    fi
done < $CHCFG


#traitemet
#->répertoire àauvegarder
for ((i=0 ; i<${#tabsave[*]} ; i++)); do

    if [ -e "${tabsave[$i]}" ]; then
    
        if [ ! -e "$dest" ]; then
            mkdir "$dest" 
            if [ $? -nq 0 ]; then
                echo "Le dossier $dest n'a pas pu etre cree"
                exit 1
            fi            
        fi
        
        #mode pour la compression des donnees
        if [ "$mode" == "compress" ]; then
            m="z"
        fi
        
        #exclusion selon les types definis dans EXTP
        if [ ! -z $extyp ]; then
            lstex="$REPCONF/list"
            echo "$extyp" | awk -F "," '{
                                            for (i=1;i<=NF;i++){
                                                print "*."$i
                                            }
                                        }' > $lstex
            opt='--exclude-from'
        fi
        
        #exclusion des repertoire definis par EXDR
        if [ ! -z ${tabexdir[0]} ]; then
            lstex="$REPCONF/list"
            
            for ((k=0 ; k<${#tabexdir[*]} ; k++));do        
                rep=`GetRepName "${tabsave[$i]}"`
                ssrep=`TroncChem "${tabexdir[$k]}" "${tabsave[$i]}"`
                
                if [ ! -z $ssrep ]; then
                    echo $rep$ssrep >> $lstex
                fi
                
            done
            
            opt='--exclude-from'
        fi
        
        tmp=`TestFileSystem $dest`
                
        case "$tmp" in

            "ntfs")
                rsync -rltDuv$m --del --ignore-errors --force $opt $lstex "${tabsave[$i]}" "$dest";;

            "fuseblk")
                rsync -rltDuv$m --del --ignore-errors --force $opt $lstex "${tabsave[$i]}" "$dest";;
                
            "vfat")
                rsync -rltDuv$m --del --ignore-errors --force $opt $lstex "${tabsave[$i]}" "$dest";;
            
            *)
                rsync -auv$m --del --ignore-errors --force $opt $lstex "${tabsave[$i]}" "$dest";;
                
        esac

    fi

done

if [ -e $lstex ]; then
    rm -f $lstex
fi

#IFS=" "

Hors ligne