Bonjour à tous,
je déterre le topic pour ajouter un script qui donne le choix des dossiers de départ et destination,
enregistre l'état dans un fichier ini, donne la possibilité de sauvegarder un état (mettre .sync à la fin des fichiers)
et donne le choix entre les trois méthodes données par la doc.
méthode complète pour créer un fichier en terminal :
mkdir $HOME/bin
cd $HOME/bin
touch sauvegarde
chmod +x sauvegarde
nano sauvegarde
et collez le texte suivant
NB dans nano : ctrl +x puis o puis entrée pour quitter en enregistrant
#!/bin/bash
# ----------------------------------------------
# by kholo - www.kholo-informatique.fr
# ----------------------------------------------
nomlogiciel="$(basename "$0")"
FONCTION="https://doc.ubuntu-fr.org/tutoriel/sauvegarder_home_avec_rsync
---------------------------------------------------------------------
Ce module crée une liste de choix pour faire des synchronisation de dossiers
selon trois méthodes
<b>1. Proposition soupaloignon
rsync -rltgoDv --del --ignore-errors --force SOURCE DEST</b>
rsync : appelle le programme rsync
-r : parcours le dossier indiqué et tous ses sous-dossiers
-l : copie les liens symboliques comme liens symboliques
-t : préserve les dates
-g : préserve le groupe
-o : mettre le propriétaire du fichier de destination identique à celui du fichier source
-D : préserve les périphériques
-v : plus loquace
--del : permet de supprimer les fichiers sur destination qui n'existent plus sur source
--ignore-errors : efface même s'il y a eu des erreurs E/S
--force : force la suppression de répertoires même non-vides
<b>2. Proposition Sorbus
rsync -av --del --stats SOURCE DEST</b>
-a : équivalent à -rlptgoD. C'est un moyen rapide de dire que vous voulez la récursion et de préserver pratiquement tout
Par rapport aux options choisies par soupaloignon, la proposition de Sorbus ajoute les options :
-p : provoque la mise à jour des permissions sur la destination pour qu'elles soient identiques aux permissions sur la source.
--stats : affiche quelques statistiques de transfert de fichiers, ce qui permet de vérifier l'efficacité de la sauvegarde.
Mais les options --ignore-errors et --force ne sont pas utilisées.
<b>3. Proposition poupoul2
rsync -a --stats --progress --delete SOURCE DEST</b>
Proposition similaire à celle de Sorbus, avec cependant deux différences par rapport aux propositions de Sorbus et de soupaloignon :
le choix de l'option --progress plutôt que de l'option -v
le choix de l'option --delete plutôt que de l'option --del
--progress : montre l'avancement pendant le transfert.
--delete : efface avant le transfert les fichiers qui n'existent pas sur la source.
--del : efface au cours du transfert (pas avant) les fichiers qui n'existent pas sur la source."
VERSION="0.04"
# NOTES DE VERSIONS
# ----------------------------------------------
# à mettre au début d'un fichier bash
#PID=$$
#FIFO=/tmp/FIFO${PID}
#mkfifo ${FIFO}
# ----------------------------------------------
echo "lancement $nomlogiciel..." ;
# "*******************initialisation*******************"
A_SAUVER=0
SCRIPT_PATH="$(pwd)" ;
FICHIER_LOG="$SCRIPT_PATH/$nomlogiciel.log" ;
FICHIER_INI="$SCRIPT_PATH/$nomlogiciel.ini" ;
FICHIER_SYNC="$FICHIER_INI"
DIR_SOURCE="$HOME" ;
DIR_DEST="/media" ;
OPTIONS="" ;
if [ ! -f "$FICHIER_LOG" ] ; then
touch "$FICHIER_LOG" ;
else
printf '%s' "" | tee "$FICHIER_LOG" ;
fi
function VoirInfos {
# zenity --info --text="$FONCTION"
zenity --info --no-wrap --text="$FONCTION"
}
function VoirUtilisation {
zenity --info --no-wrap --text="Manuel utilisateur
Ce script est basé sur unity et les bases bash.
Chaque ligne conduit vers une fonction... ou rien (lignes de commentaires ou de mise en page).
L'idée est la gestion d'un fichier ini et de fichiers texte de configuration.
Les paramètres sont enregistrés dans le fichier ini en fin de session et propose l'enregistrement d'un fichier pour y enregistrer ses préférences.
Il est possible d'ouvrir une précédente sauvegarde et d'en créer de nouvelles.
Rsync :
Ici ce principe est utilisé pour appliquer au choix une ou plusieurs méthodes de sauvegarde à un dossier source vers un dossier destination.
les trois choix sont représentés dans trois fonctions SOLUTION00X.
Les détails de chaque choix sont expliquées dans les explications."
}
function Journal {
# echo "$@" | tee -a "$FICHIER_LOG" ;
printf '%s' "$@
" | tee -a "$FICHIER_LOG" ;
}
Journal "====================================
$(date)
ouverture du Journal" ;
# GESTION DES FICHIERS INI
# *********************************************
Journal "Chargement..." "charger Initialisation"
function Ini_File {
if [ -f "$FICHIER_INI" ] ;
then
ChargerIni ;
else
touch "$FICHIER_INI" ;
SauverIni ;
fi
}
Journal "Chargement..." "ChargerIni"
function ChargerIni {
while read line ;
do
ParserLigneIni "$line" ;
done < "$FICHIER_INI" ;
}
Journal "Chargement..." "SauverIni"
function SauverIni {
printf '%s' "FICHIER_SYNC=$FICHIER_SYNC
DIR_SOURCE=$DIR_SOURCE
DIR_DEST=$DIR_DEST
OPTIONS=$OPTIONS
" | tee "$FICHIER_INI" ;
}
Journal "Chargement..." "ParserLigneIni"
function ParserLigneIni {
i=$@ ;
case $i in
# xxxxx=*) xxxxxx="${i#*=}" ;;
FICHIER_SYNC=*) FICHIER_SYNC="${i#*=}" ;;
DIR_SOURCE=*) DIR_SOURCE="${i#*=}" ;;
DIR_DEST=*) DIR_DEST="${i#*=}" ;;
OPTIONS=*) OPTIONS="${i#*=}" ;;
esac
}
Journal "Chargement..." "ChoisirIni"
function ChoisirIni {
FILE="$(zenity --file-selection --title='Selectionnez un fichier' \
--file-filter="Sync files (ini,sync) | *.ini *.sync") --text=$FICHIER_INI"
case $? in
0) FICHIER_INI="$FILE" ;
ChargerIni ;;
1) zenity --question \
--title="choix" \
--text="Aucun fichier sélectionné, recommencer ?" \
&& ChoisirIni ;;
# && ChoisirIni || exit;;
-1) echo "An unexpected error has occurred."; exit;;
esac
# zenity --info --text="$FICHIER_INI" ;
}
Journal "lancement..." "Ini_File principal"
Ini_File ;
# FIN GESTION DES FICHIERS INI
# *********************************************
# GESTION DES FICHIERS SYNC
# *********************************************
Journal "Chargement..." "charger sync"
function Sync_File {
if [ -f "$FICHIER_SYNC" ] ;
then
chargerSync ;
else
touch "$FICHIER_SYNC" ;
SauverSync ;
fi
}
Journal "Chargement..." "chargerSync"
function ChargerSync {
while read line ;
do
ParserLigneSync "$line" ;
done < "$FICHIER_SYNC" ;
}
Journal "Chargement..." "SauverSync"
function SauverSync {
FILE="$(zenity --file-selection --save --confirm-overwrite --title='SAUVER : Selectionnez un fichier' \
--filename="$FICHIER_SYNC" --file-filter="Sync files (sync) | *.sync")"
case $? in
0) FICHIER_SYNC="$FILE" ;
A_SAUVER=0
SaveSync ;;
# ChargerSync ;;
1) VALEUR_INUTILE="rien" ;;
# zenity --question \
# --title="choix" \
# --text="Aucun fichier sélectionné, recommencer ?" \
# && SauverSync ;;
# && ChoisirSync || exit;;
-1) echo "An unexpected error has occurred."; exit ;;
esac
}
function SaveSync {
printf '%s' "FICHIER_SYNC=$FICHIER_SYNC
DIR_SOURCE=$DIR_SOURCE
DIR_DEST=$DIR_DEST
OPTIONS=$OPTIONS
" | tee "$FICHIER_SYNC" ;
}
Journal "Chargement..." "ParserLigneSync"
function ParserLigneSync {
i=$@ ;
case $i in
# xxxxx=*) xxxxxx="${i#*=}" ;;
# FICHIER_SYNC=*) FICHIER_SYNC="${i#*=}" ;;
DIR_SOURCE=*) DIR_SOURCE="${i#*=}" ;;
DIR_DEST=*) DIR_DEST="${i#*=}" ;;
OPTIONS=*) OPTIONS="${i#*=}" ;;
esac
}
Journal "Chargement..." "ChoisirSync"
function ChoisirSync {
FILE="$(zenity --file-selection --title="OUVRIR : Selectionnez un fichier" --text="$FICHIER_SYNC" \
--filename="$FICHIER_SYNC" --file-filter="Sync files (sync) | *.sync")"
case $? in
0) FICHIER_SYNC="$FILE" ;
A_SAUVER=1
ChargerSync ;;
1) zenity --question \
--title="choix" \
--text="Aucun fichier sélectionné, recommencer ?" \
&& ChoisirSync ;;
# && ChoisirSync || exit;;
-1) echo "An unexpected error has occurred."; exit;;
esac
# zenity --info --text="$FICHIER_SYNC" ;
}
# FIN GESTION DES FICHIERS SYNC
# *********************************************
Journal "Chargement..." "_quitter"
function _quitter {
# mettre ici tout ce qui sera nescessaire à la bonne fermeture
if [ "$A_SAUVER -eq 1" ] ; then
SauverSync ;
else
zenity --info --text="rien à sauver"
fi
SauverIni ;
exit 0
}
Journal "Chargement..." "SetDIR_SOURCE"
function SetDIR_SOURCE {
# Choisir le dossier DIR_SOURCE
tmpDIR_SOURCE=$(zenity --file-selection \
--filename="${DIR_SOURCE}" \
--title="Veuillez selectionner un dossier" \
--text="Choissisez un dossier source
Annulez pour conserver
${DIR_SOURCE}" \
--directory);
if [ $? = 0 ] ; then
# "Détecter la présence du volume de destination et interrompre l'opération si nécessaire"
if [ ! -e "$tmpDIR_SOURCE" ] ; then
Journal "Attention, je ne trouve pas la source demandée" ;
# exit 100 ;
else
A_SAUVER=1
DIR_SOURCE="${tmpDIR_SOURCE}" ;
fi
# else
# _quitter ;
fi
}
Journal "Chargement..." "SetDIR_DEST"
function SetDIR_DEST {
# Choisir le dossier DIR_DEST
tmpDIR_DEST=$(zenity --file-selection \
--filename="${DIR_DEST}" \
--title="Veuillez selectionner un dossier" \
--text="Choissisez un dossier de destination
Annulez pour conserver
${DIR_DEST}" \
--directory);
if [ $? = 0 ] ; then
# "Détecter la présence du volume de destination et interrompre l'opération si nécessaire"
if [ ! -e "$tmpDIR_DEST" ] ; then
Journal "Attention, le disque de sauvegarde n'est pas présent" ;
# exit 101 ;
else
A_SAUVER=1
DIR_DEST="${tmpDIR_DEST}" ;
fi
# else
# _quitter ;
fi
}
Journal "Chargement..." "SOLUTION001"
function SOLUTION001 {
zenity --info --no-wrap --text="Proposition soupaloignon
rsync : appelle le programme rsync
-r : parcours le dossier indiqué et tous ses sous-dossiers
-l : copie les liens symboliques comme liens symboliques
-t : préserve les dates
-g : préserve le groupe
-o : mettre le propriétaire du fichier de destination identique à celui du fichier source
-D : préserve les périphériques
-v : plus loquace
--del : permet de supprimer les fichiers sur destination qui n'existent plus sur source
--ignore-errors : efface même s'il y a eu des erreurs E/S
--force : force la suppression de répertoires même non-vides
$DIR_SOURCE : répertoire source
$DIR_DEST : répertoire destination
Cette ligne de commande va donc transférer le contenu de $DIR_SOURCE
vers la destination $DIR_DEST.
-----------------------------------------------
rsync -rltgoDv --del --ignore-errors --force DIR_SOURCE DIR_DEST ;"
rsync -rltgoDv --del --ignore-errors --force "$DIR_SOURCE" "$DIR_DEST" ;
}
Journal "Chargement..." "SOLUTION002"
function SOLUTION002 {
zenity --info --no-wrap --text="Proposition Sorbus
-a : équivalent à -rlptgoD. C'est un moyen rapide de dire que vous voulez la récursion
et de préserver pratiquement tout
Par rapport aux options choisies par soupaloignon, la proposition de Sorbus ajoute les options :
-p : provoque la mise à jour des permissions sur la destination pour qu'elles soient identiques
aux permissions sur la source.
--stats : affiche quelques statistiques de transfert de fichiers, ce qui permet de vérifier
l'efficacité de la sauvegarde.
Mais les options --ignore-errors et --force ne sont pas utilisées.
$DIR_SOURCE : répertoire source
$DIR_DEST : répertoire destination
-----------------------------------------------
rsync -av --del --stats DIR_SOURCE DIR_DEST ;" ;
rsync -av --del --stats "$DIR_SOURCE" "$DIR_DEST" ;
}
Journal "Chargement..." "SOLUTION003"
function SOLUTION003 {
zenity --info --no-wrap --text="Proposition poupoul2
Proposition similaire à celle de Sorbus,
avec cependant deux différences par rapport aux propositions de Sorbus et de soupaloignon :
le choix de l'option --progress plutôt que de l'option -v
le choix de l'option --delete plutôt que de l'option --del
--progress : montre l'avancement pendant le transfert.
--delete : efface avant le transfert les fichiers qui n'existent pas sur la source.
--del : efface au cours du transfert (pas avant) les fichiers qui n'existent pas sur la source.
$DIR_SOURCE : répertoire source
$DIR_DEST : répertoire destination
-----------------------------------------------
rsync -a --stats --progress --delete DIR_SOURCE DIR_DEST ;" ;
rsync -a --stats --progress --delete "$DIR_SOURCE" "$DIR_DEST" ;
}
Journal "Chargement..." "sauvegarde"
function sauvegarde {
zenity --info --no-wrap --text="
# $FICHIER_SYNC : fichier sync
# $DIR_SOURCE : répertoire source
# $DIR_DEST : répertoire destination
# OPTIONS : $OPTIONS"
rsync -"$OPTIONS" "$DIR_SOURCE" "$DIR_DEST" ;
}
# echo "La commande de sauvegarde a terminé son travail..." ;
# echo "Vérifiez dans le terminal s'il n'y a pas eu d'erreur !" ;
Journal "Chargement..." "frm_principale"
function frm_principale {
# Journal "*******************frm_principale*******************"
LAQUESTION="https://doc.ubuntu-fr.org/tutoriel/sauvegarder_home_avec_rsync
---------------------------------------------------------------------
Ce module crée une liste de choix pour faire des synchronisations de dossiers
selon trois méthodes"
KH="Ouvrir .SYNC" ;
VH="$FICHIER_SYNC" ;
KI="Sauve .SYNC" ;
VI="double-cliquez ici !" ;
KA="DIR_SOURCE" ;
VA="$DIR_SOURCE" ;
KB="DIR_DEST" ;
VB="$DIR_DEST" ;
KC="Choisir OPTIONS" ;
VC="$OPTIONS" ;
KD="lancer >>" ;
VD="soupaloignon : -rltgoDv --del --ignore-errors --force" ;
KE=" >>";
VE="Sorbus : -av --del--stats" ;
KF=" >>" ;
VF="poupoul2 : -a --stats --progress --delete" ;
KG=" >>" ;
VG="Voir Explications" ;
KJ="Aide >>" ;
VJ="Utilisation" ;
zenity --list --width=1300 --height=600 --text="$LAQUESTION" \
--ok-label="Sélectionner" \
--cancel-label="quitter" \
--hide-column 1 --column "" --column "choix" --column "Valeur" \
0 "============" "double cliquez sur une ligne pour l'ouvrir" \
8 "$KH" "$VH" \
9 "$KI" "$VI" \
0 "============" "===============================================================" \
1 "$KA" "$VA" \
2 "$KB" "$VB" \
0 "============" "===============================================================" \
4 "$KD" "$VD" \
5 "$KE" "$VE" \
6 "$KF" "$VF" \
0 "============" "===============================================================" \
10 "$KJ" "$VJ" \
7 "$KG" "$VG" \
0 "============" "===============================================================" ; #
# 0 "" "" \
# 0 "********" "mettre options sans le premier -" \
# 3 "$KC" "$VC" \
}
Journal "Chargement..." "frm_principale_parser"
function frm_principale_parser {
Journal "frm_principale_parser : $1"
case $1 in
1) SetDIR_SOURCE ;;
2) SetDIR_DEST ;;
# 3) action 3 ;;
4) SOLUTION001 ;;
5) SOLUTION002 ;;
6) SOLUTION003 ;;
7) VoirInfos ;;
8) ChoisirSync ;;
9) SauverSync ;;
10) VoirUtilisation ;;
0) echo "" ;;
*) #quitter="1"
_quitter ;;
esac
}
Journal "Chargement..." "_main"
function _main {
# Journal "_main" ;
menuchoice=$(frm_principale) ;
Journal "menuchoice=${menuchoice%|*}"
frm_principale_parser ${menuchoice%|*} ; # pour corriger le 1|1
if [ $quitter!="1" ] ; then
# on boucle _main tant que quitter est différent de 1
_main
fi
}
Journal "lancement..." "main principal"
_main
exit 0
Pour lancer :
cd $HOME/bin
./sauvegarde