# Script double sauvegarde : deux réflexions

**URL:** <https://www.debian-fr.org/t/script-double-sauvegarde-deux-reflexions/34137>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 3:32 UTC](https://www.debian-fr.org/t/script-double-sauvegarde-deux-reflexions/34137 "2016-02-21T03:32:06Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:32 UTC](https://www.debian-fr.org/t/script-double-sauvegarde-deux-reflexions/34137/1 "2016-02-21T03:32:06Z")

</div>

## La première n’est pas à proprement parler du domaine de la programmation mais plutôt de la logique : Dans le cas présent qui propose une “double sauvegarde alternée”, qui, dans un exemple de sauvegarde hebdomadaire, offre un “cliché” de ‘jour -7’ et un plus ancien de ‘jour - 14’. Sachant que quand on effectue la sauvegarde, on va remplacer le “cliché” ‘jour -14’ par le “cliché”‘jour’, il n’est ptet pas utile d’effectuer une copie ‘backup’, puisque celle-ci sera identique au “cliché” ‘jour -7’, lequel n’est pas concerné par l’actuelle sauvegarde. Je sais que mon explication n’est pas très claire mais si vous arrivez à me traduire, j’aimerais votre avis.

La seconde réflexion est ce qui pourrait être une erreur que je viens de relever.  
Voici d’abord un rappel du script complet :

[code]#!/bin/bash

### BEGIN INIT INFO

# Nom du script : sauvegarde

# Auteur : Ricardo, aidé de l’équipe de ‘[debian-fr.org](http://debian-fr.org)’

# Date de création : juillet 2011

# Utilité : faciliter les sauvegardes

# Version : cette version est écrite pour l’utilisation avec deux partitions de sauvegarde, à alterner dans le temps.

#+ Il est souhaitable que ces partitions soient sur un DD différent de celui qui abrite le système.  
#+ Ce script a été écrit de façon à ce qu’il soit le plus générique possible. Les seules données que vous devriez devoir changer,  
#+ se trouvent dans la partie droite des variables.

# Pre-requis : voir tuto = [http://www.debian-fr.org/sauvegarde-clonage-d-une-sid-t25179.html](http://www.debian-fr.org/sauvegarde-clonage-d-une-sid-t25179.html)

#+ et page du WIKI = [http://www.isalo.org/wiki.debian-fr/index.php?title=Script\_de\_double\_sauvegarde\_alternée](http://www.isalo.org/wiki.debian-fr/index.php?title=Script_de_double_sauvegarde_altern%C3%A9e)

# Description : script permettant d’effectuer, régulièrement et de façon simple, les sauvegardes de son système

# Droits : entièrement libres mais en cas de copie, la citation de “[debian-fr.org](http://debian-fr.org)” nous serait agréable

# Modifié le : 22 août 2011

# Objet de la modification : améliorations diverses

### END INIT INFO

#----------------- Fonctions ----------------------------  
function sauvegarde()  
{  
sudo rsync -av --del --backup --backup-dir="$1" --exclude-from="$2" “$3” “$4”

```
	# Teste si la sauvegarde a abouti ( = 0), sinon, on sort.
	if (("$?" > 0))
	then
			printf "\nErreur lors de la sauvegarde de %s\n" "$3" 
	else
			printf "\nSauvegarde de %s : OK\n" "$3"
			sleep 10
	fi  

```

}

function sortie\_propre()  
{  
# Si la partition de sauvegarde n’était pas montée lors de l’appel, on la démonte avant de sortir.  
if [“${deja\_montee}” = 0]  
then  
sudo umount "${mount\_rep}"  
else   
# Si la partition de sauvegarde était déjà montée lors de l’appel, on sort sans la démonter mais en s’assurant que les données ont bien été écrites.  
sync  
fi  
exit  
}

#----------------- Variables -------------------

# CETTE PARTIE DOIT RETENIR TOUTE VOTRE ATTENTION, C’EST LÀ QUE VOUS PERSONNALISEREZ CE SCRIPT

#+ POUR CE FAIRE, JE VOUS CONSEILLE DE VOUS RÉFÉRER AU TUTO ET AU SCRIPT INDIQUÉS DANS LE “PRE-REQUIS” DU “BEGIN INIT INFO”

mount\_rep="/mnt/autre"

# la première donnée, vide, figure le [0], de façon à commencer par [1]

ddext=(’’ ‘/dev/sdb9’ ‘/dev/sdb10’)  
systeme\_fich=(’’ ‘ext3’ ‘ext2’)  
controle=(’’ ‘/home/controle’ ‘/home/controle-ricardo’)  
exclure=(’’ ‘/root/exclure’ ‘/home/ricardo/.exclure’)  
sauve=(’’ ‘/mnt/autre/sauve’ ‘/mnt/autre/sauve-ricardo’)  
dossier\_a\_sauver=(’’ ‘/’ ‘/home/ricardo’)

#----------------- Départ du script ----------------------------

# Teste l’existence du dossier de montage, sinon, on sort avec erreur 1.

```
mkdir -p "${mount_rep}" || { echo "Le dossier de montage n'existe pas !" >&2; exit 1; }	

```

# Choix, puis test de la partition de sauvegarde. Si le montage ne s’effectue pas, on sort via la fonction sortie\_propre()

deja\_montee=0  
PS3="Entrez le N° de la sauvegarde choisie : "  
select choix\_sauvegarde in “sauve” “sauve2” quitter  
do  
case ${REPLY} in  
[1-2])   
index=${REPLY}  
if [! -e “${ddext[$index]}” ]  
then  
printf “\n Impossible de se connecter à %s \n Vérifiez qu’il s’agit de la bonne partition et recommencez \n” “${ddext[$index]}” \>&2; exit 1;  
else  
if ! grep -q “^${ddext[$index]} “${mount\_rep}” ${systeme\_fich[$index]}” /etc/mtab  
then  
sudo mount -t “${systeme\_fich[$index]}” “${ddext[$index]}” “${mount\_rep}” || { deja\_montee=1; sortie\_propre; }  
break  
else  
printf "Info : La partition ${ddext[$index]} est déjà montée\n"  
deja\_montee=1  
break  
fi   
fi   
;;  
3) echo “On sort du script”; sortie\_propre  
;;  
\*) echo “Saisie non valide !”  
;;  
esac  
done

# Teste l’emplacement de la corbeille et si elle est pleine (présence de fichier(s) dans … /files). Si elle l’est, liste les fichiers qu’elle contient

echo -e “\033[4mCONTENU de la CORBEILLE\033[0m\n”

[-z “$XDG\_DATA\_HOME”] && chemin\_trash="$HOME/.local/share/Trash" || chemin\_trash="$XDG\_DATA\_HOME/Trash"  
corbeille="$chemin\_trash/files"

```
if [-z $(ls -A "$corbeille") &> /dev/null] 
then
	echo "LA CORBEILLE EST VIDE"		
else		 
	ls -a "$corbeille"	
	read -p "on peut la vider ? o/* : " vider	 
		if ["$vider" = o] 
		then	
			shopt -s dotglob
			rm -rf "$chemin_trash"/{files/,info/,metadata}*
			shopt -u dotglob
			echo "CORBEILLE VIDÉE"
		else
			echo -e "\033[4mCORBEILLE CONSERVÉE PLEINE\033[0m"
		fi		
fi 		

```

# Ordre de sauvegarde faisant appel à la fonction ‘sauvegarde()’

read -p "prêt pour la sauvegarde ? o/\* : " onyva  
if [“$onyva” = o]  
then  
for((index=1; index \< ${#controle[@]}; index++))  
do  
sauvegarde “${controle[$index]}” “${exclure[$index]}” “${dossier\_a\_sauver[$index]}” "${sauve[$index]}"  
done  
fi  
sortie\_propre

[/code]

Dans cette partie des variables :  
sauve=(’’ ‘/mnt/autre/sauve’ ‘/mnt/autre/sauve-ricardo’)  
dossier\_a\_sauver=(’’ ‘/’ ‘/home/ricardo’)  
Comme elle est proposée, /home/ricardo sera sauvegardé en créant un dossier supplémentaire ‘sauve-ricardo’  
D’après ce que j’ai compris du man rsync, pour que seul le contenu soit ajouté, il faut placer une ‘/’ en fin de dossier source.  
Ce qui devrait donc donner  
dossier\_a\_sauver=(’’ ‘/’ ‘/home/ricardo[size=150]/[/size]’)

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:32 UTC](https://www.debian-fr.org/t/script-double-sauvegarde-deux-reflexions/34137/2 "2016-02-21T03:32:21Z")

</div>

Bon, comme ma question n’a pas l’air de soulever les foules, j’ai testé ce que j’ai présenté plus haut et c’est bon :  
ligne

```auto

```

est supprimée  
ligne

```auto

```

devient

```auto

```

et lignes

`for((index=1; index < ${#controle[@]}; index++))
      do
         sauvegarde "${controle[$index]}" "${exclure[$index]}" "${dossier_a_sauver[$index]}" "${sauve[$index]}"
      done `  
deviennent

## `for((index=1; index < ${#exclure[@]}; index++)) do sauvegarde "${exclure[$index]}" "${dossier_a_sauver[$index]}" "${sauve[$index]}" done`

ligne

```auto

```

devient

```auto

```
