#1 Le 29/06/2010, à 22:23
- H.Dimitri
Mon script qui syncronise deux dossier en alpha
Salu
Bien que je ne suis pas un grand actif du forum, vu que j'ai pas mal fouillé dans les archives du forum pour le réaliser, et qu'une partie du forum y est dédié, j'ai pensé que cela pourrait intéresser quelques uns.
Ce script ne synchronise pas deux dossier à proprement parler (c'est pour ça que je l'ai réalisé) mais plutôt les modification qui y survienne :
si vous créez ou éditez un fichier dans l'un des deux il est automatiquement copié dans le second
si vous effacez un fichier dans l'un des deux il est effacé dans l'autre et sans passer par la corbeille!
Attention : je ne sait pourquoi (je ne réalise pas souvent de script donc il se peut qu'il comporte des erreurs), lorsque l'on synchronise vers un périphérique lent, des bizarreries apparaissent (lorsque on efface un fichier il est re-recopiée ou le fichier de l'autre dossier n'est pas effacé etc...), personnellement ça ne me dérange pas trop, mais si vous avez des données sensibles...
Avant de le poster j'ai rajouté des sortes des valves : le script n'efface pas plus de 5 fichier à la foi à l'aveuglette, et ne synchronise pas deux fichier si les deux de chaque dossier synchronisé ont été édités (mais la encore il peut y avoir des problèmes de date comme indiqué ci-dessus...), donc je vous conseille de ne pas utiliser ce script si vous ne l'avez pas lu entièrement entièrement compris
Je dit ça mais référez vous a ce qui posteront des commentaires pour voir ce qu'ils en pensent...
sur ce :
titre=$(echo $0 | sed "s/^.*\/\(.*\)$/\1/") #titre du script
autostart=$(echo "$HOME/.kde/Autostart/$titre") #Racourcis du scipt
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#Initialisation
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if test "$1" = "" ; then
if test ! -e ~/.backup ; then mkdir ~/.backup ; fi #évite au script de buger lors de la création de fichiers
if test ! -e "$autostart" ; then ln -s "$(pwd)/$titre" "$autostart" ; fi #installe le script
if test ! -e ~/.backup/dpkg.log ; then dpkg --get-selections > ~/.backup/dpkg.log ; fi #crée la liste des packets installé par défault
#prend par défaul le plus petit des disques inséré (en général lors d'un backup la destination est plus petite que la source)
#Attention qu'elle ne s'efectue par vars une autre partition du meme disque dur
if test ! -e ~/expr.ini ; then
sh "$autostart" "--help" #créer le fichier d'aide et l'affiche
test=$(sh "$autostart" "Attention" "$HOME/.backup/help.txt" "Créer le fichier par défault ? (Voir aide:tappez V)") #génère le fihier ~/expr.ini
if test $test = "y" ; then
echo "1
source 1 =$HOME
destination 1 =/media/$(ls -rS /media/| head -1)$HOME
inclusions 1 =.
exclusions 1 =.backup.|.[Cc]ache.|.Trash.|.kde.|.Flash.|.thumbnails.|.share.|.mozilla.
" > ~/expr.ini
fi
else
sh "$autostart" "lanceur" #si il existe déjas : démare la suncronisation
fi
fi
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#Sauvegarde
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#ça c'est pas de moi : http://doc.ubuntu-fr.org/tutoriel/comment_sauver_et_restaurer_la_liste_des_paquets
#est cesncé enregistrer la liste des paquets installé depuit la création du fichier ~/dpkg.log
#a faire -> fusionner celle qui est présente dans la destination
if test "$1" = "packets" ; then
sudo dpkg --set-selections < ~/dpkg.txt #rentre la dernière liste de paquets
sudo apt-get -u dselect-upgrade #fait la mise à jour
dpkg --get-selections > ~/.backup/var5.txt #récupère la liste obtenu des paquet
fgrep ~/.backup/var5.txt ~/.backup/dpkg.log > ~/dpkg.txt
fi
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if test "$1" = "backup" ; then
#extrait les arguments
source="$(sed -n "/ *source *$2 *= */,/\n/{//p}" ~/expr.ini | sed "s/^ *source *$2 *= *//")"
destination="$(sed -n "/ *destination *$2 *= */,/\n/{//p}" ~/expr.ini | sed "s/^ *destination *$2 *= *//")"
inclusions="$(sed -n "/ *inclusions *$2 *= */,/\n/{//p}" ~/expr.ini | sed "s/^ *inclusions *$2 *= *//" | sed "s/\//\\\\\//g" | sed "s/|/\\\\|/g")"
exclusions="$(sed -n "/ *exclusions *$2 *= */,/\n/{//p}" ~/expr.ini | sed "s/^ *exclusions *$2 *= *//" | sed "s/\//\\\\\//g" | sed "s/|/\\\\|/g")"
Source="$(echo "$source" | sed "s/\//\\\\\//g")" #ajoute les "\" pour les sed
Destination="$(echo "$destination" | sed "s/\//\\\\\//g")" #ajoute les "\" pour les sed
backup="$(echo ~/.backup/$(echo "$source" | sed "s/\//_/g"))-$(echo "$destination" | sed "s/\//_/g")" #unique : évite que deux instances rentrent en conflit
if test $inclusions = "" ; then inclusions="$(echo ".")" ; fi #si non spécifé : par défault inclu tout
if test $exclusions = "" ; then exclusions="$(echo "^$")" ; fi #si non spécifié : par défault exclus rien
#=======================================================================================================================================================================
while test true ; do
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if test -e "$destination" -a -e "$source" ; then #si la source et la destination existent
k="1 2" # 1 -> dans un sens 2 -> dans l'autre
for i in $k ; do
if test $i = "2" ; then # 2 -> inverse le sens
tmp=$destination ; destination=$source ; source=$tmp
Tmp=$Destination ; Destination=$Source ; Source=$Tmp
backup="$(echo ~/.backup/$(echo "$source" | sed "s/\//_/g"))-$(echo "$destination" | sed "s/\//_/g")"
fi
#-------------------------------------------------------------------------------------------------------------------------------------------------------
n=$(cat "$backup-find") #numéro unique de syncronisations
rm -f "$backup-find$((n-1))" #éfface la derniere instance
if test ! -e "$backup-find$((n))" ; then
> "$backup-find$((n))" #si c'est la 1ère fois...
fi
if test ! -e "$backup-find$((n+1))" ; then #créer la liste de fichier actuem
find "$source" | sed "s/^$Source//" > "$backup-var1.txt"
sh "$autostart" "lignes sélectionnées" "$backup-var1.txt" "$inclusions" "$exclusions" > "$backup-find$((n+1))"
fi
#liste les fichiers disparus
sh "$autostart" "lignes en moins" "$backup-find$((n))" "$backup-find$((n+1))" > "$backup-var2.txt"
#n'éfface pas les fichier si ils on été reédités dans la destination
find "$destination" -newer "$backup-find$((n))" | sed "s/^$Destination//" > "$backup-var3.txt" #récents
sh "$autostart" "lignes en moins" "$backup-var2.txt" "$backup-var3.txt" | sed "s/^/$Destination/" > "$backup-return.txt"
courent=$((1)) ; ligne=$(($(wc -l "$backup-return.txt" | cut -d\ -f1)))
#...............................................................................................................................................
if test $((5)) -le $(($(wc -l "$backup-return.txt" | cut -d\ -f1))) ; then #si il y a plus de 5fichiers à affacer : damande que faire
test=$(sh "$autostart" "Attention" "$backup-return.txt" "Bizzare bizarre, backup à trouvé plus de 5 fichiers à effacer!\nvouler vous vraiment les éffacer ?")
else
test="y" #sinon répond machinallement oui
fi
if test "$test" = "y" ; then #si il y a un oui retourner, afface les fichiers un à un
while test ! $((courent)) = $((ligne+1)) ; do
supprimer=$(head -$((courent)) "$backup-return.txt" | tail -1)
rm -f "$supprimer"
courent=$((courent+1))
done
fi
#...............................................................................................................................................
echo $((n+1)) > "$backup-find" #valide la délétion
#-------------------------------------------------------------------------------------------------------------------------------------------------------
#efectue la copie
n=$(cat "$backup-date")
rm -f "$backup-date$((n-1))" #éfface la date de la dernière fois
if test ! -e "$backup-date$((n+1))" ; then > "$backup-date$((n+1))" ; fi
#-------------------------------------------------------------------------------------------------------------------------------------------------------
if test ! -e "$backup-date$((n))" ; then #si c'est laère fois
find "$source" | sed "s/^$Source//" > "$backup-va1.txt"
find "$destination" | sed "s/^$Destination//" > "$backup-va12.txt"
else #sinon n'effectue que les nouveaux fichiers
find "$source" -newer "$backup-date$((n))" | sed "s/^$Source//" > "$backup-va1.txt"
find "$destination" -newer "$backup-date$((n))" | sed "s/^$Destination//" > "$backup-va12.txt"
fi
#-------------------------------------------------------------------------------------------------------------------------------------------------------
sh "$autostart" "lignes sélectionnées" "$backup-va1.txt" "$inclusions" "$exclusions" > "$backup-va2.txt"
#-------------------------------------------------------------------------------------------------------------------------------------------------------
sh "$autostart" "lignes communes" "$backup-va2.txt" "$backup-va12.txt" >"$backup-va12.txt"
if test $((1)) -le $(($(wc -l "$backup-va12.txt" | cut -d\ -f1))) ; then #si des fichiers existent et dans la source et dans la destination
test=$(sh "$autostart" "Attention" "$backup-va12.txt" "Bizzare bizarre, backup à trouvé des fichiers édités\nET dans la destination ET dans la source.\nVoulez vous vraiment remplacer ceux de\n$destination\par ceux de\n$source ?\n")
else
test="y" #sinon répond machinallement oui
fi
if test $test = "n" ; then #si un non a été retourné
sh "$autostart" "lignes en plus" "$backup-va12.txt" "$backup-va2.txt" > "$backup-va3.txt" #ne les syncronise pas
else #si un oui a été retourné
cat "$backup-va2.txt" > "$backup-va3.txt" #recopie la liste complète
fi
#-------------------------------------------------------------------------------------------------------------------------------------------------------
#fichier source
cat "$backup-va3.txt" | sed "s/^/$Source/" > "$backup-return1.txt"
#donssier de destination
cat "$backup-va3.txt" | sed "s/^/$Destination/" | sed "s/\(.*\)\/.*/\1/" > "$backup-return2.txt"
courent=$((1)) ; ligne=$(($(wc -l "$backup-va2.txt" | cut -d\ -f1)))
#-------------------------------------------------------------------------------------------------------------------------------------------------------
while test ! $((courent)) = $((ligne+1)) ; do #copie ce qu reste un à un
v1=$(head -$((courent)) "$backup-return1.txt" | tail -1)
v2=$(head -$((courent)) "$backup-return2.txt" | tail -1)
mkdir -p "$v2"
cp "$v1" "$v2"
courent=$((courent+1))
done
#-------------------------------------------------------------------------------------------------------------------------------------------------------
echo $((n+1)) > "$backup-date"
done
sleep 30
else
sleep 10
fi
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sh "$autostart" "packets" & #sauvegarde les paquets
done
#=======================================================================================================================================================================
fi
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#Execution
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#en cas de conflit, ce n'est pas le fichier le plus récent qui gagne mais celui de la destination! (ça peut plaire à certain et enrager d'autres...)
#Mais j'ai la flème de tout configurer en double
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#lanceur fastice
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if test "$1" = "lanceur" ; then #extrait ~/expr.ini et lance les syncronisations une à une
m=$(($(head -1 ~/expr.ini | tail -1)))
for n in $m ; do
sh "$autostart" "backup" "$n" & #et on le lance
done
#=======================================================================================================================================================================
while test true ; do sleep 300 ; done #empèche le script de se refermer
#=======================================================================================================================================================================
fi
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ù%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if test "$1" = "Attention" ; then
> "$2-test"
while test ! "$(head -1 "$2-test" | tail -1)" = "y" -a ! "$(head -1 "$2-test" | tail -1)" = "n" ; do
xterm -e "$autostart" "Attention2" "$2" "$3"
if test "$(head -1 "$2-test" | tail -1)" = "y" ; then
echo "y"
elif test "$(head -1 "$2-test" | tail -1)" = "n" ; then
echo "n"
fi
done
fi
if test "$1" = "Attention2" ; then
test="V"
echo "$3"
echo "[y = oui / n = non / V = voir les détails]"
while test ! $test = "y" -a ! $test = "n" ; do
read test
if test $test = "y" ; then
test="y" ; echo "y" > "$2-test"
elif test $test = "n" ; then
test="n" ; echo "n" > "$2-test"
elif test $test = "V" ; then
xterm -e "$autostart" "voir" "$2"
else
echo "\nQuoi?"
fi
done
fi
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if test "$1" = "voir" ; then
less "$2"
fi
#comparaison%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if test "$1" = "lignes communes" ; then
cat "$2" | sed 's/^/"/' | sed 's/$/"/' > "$2-2"
cat "$3" | sed 's/^/"/' | sed 's/$/"/' > "$3-2"
fgrep -f "$2-2" "$3-2" | sed 's/^"//' | sed 's/"$//'
rm -f "$2-2"
rm -f "$3-2"
fi
if test "$1" = "lignes en moins" ;then
cat "$2" | sed 's/^/"/' | sed 's/$/"/' > "$2-2"
cat "$3" | sed 's/^/"/' | sed 's/$/"/' > "$3-2"
fgrep -vf "$3-2" "$2-2" | sed 's/^"//' | sed 's/"$//'
rm -f "$2-2"
rm -f "$3-2"
fi
if test "$1" = "lignes en plus" ; then
cat "$2" | sed 's/^/"/' | sed 's/$/"/' > "$2-2"
cat "$3" | sed 's/^/"/' | sed 's/$/"/' > "$3-2"
fgrep -vf "$2-2" "$3-2" | sed 's/^"//' | sed 's/"$//'
rm -f "$2-2"
rm -f "$3-2"
fi
if test "$1" = "lignes sélectionnées" ; then
cat "$2" | sed "/$3/d" > "$2-2"
sh "$autostart" "lignes en moins" "$2" "$2-2" | sed "/$4/d"
rm -f "$2-2"
fi
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if test "$1" = "--help" ;then
echo "Bonjour $USER ce script à été crée par H.Dimitri
_______________________________________________________________________________
Instalation
Pour faire fonctioner le script, veulliez créer d'abord le fichier ~/expr.ini
Puit crée le(s) dossier(s) de desitnation et/ou de source
(je vous conselle d'inclure les chemins complets lors d'un backup)
Enfin mettet le script dans Votre home ($HOME),
exécuter le une foie sans argument (ou faite cd ~/ ; sh $titre
puit joutez le au démarage (sauf pour KDE).
enfin, n'y touchez plus et relogez vous : les syncronisations s'effecturons
_______________________________________________________________________________
désinstalation :
Dans l'ordre :
éffacez le fichier $titre
affacer le fichier ~/expr.ini
effacer le fichier $autostart
videz le dossier $HOME/.backup
_______________________________________________________________________________
le fichier ~/expr.ini doit avoir le format suivant
(l'ordre à l'exeption de la 1ère ligne n'est pas primordial):
a b c ... > nom des syncronisations à effectuer
source a = /.../source
destination a = /.../destination
inclusions a = (expression rationnelle) > facultative (inclu tout)
exclusions a = (expression rationnelle) > facultative (exclu rien)
(Ceux qui connaissent les expressions rationelles: *source *b *= */.../source)
.
.
.
_______________________________________________________________________________
note : les expression rationelle peuvent comporter les motifs suivant :
expression 1 | expression 2 | expression 3
(fichiers 1 ou fichiers 2 ou fichiers 3)
/.../dossier/. : inclu tout les chemins comançant par /.../dossier/
(le . représente toutes les sous chaine possibles,
pour représenter un point, veulliez faire : \. )
à contrario, .dossier inclu tous chemins finissant par dossier et
.dossier. inclus tous chemins contenant le mot dossier
[Aa] (représente la lettre a ou sa majuscule)
[a-z] (représente une muniscule non accentué)
[0-9] (représent un chiffre)
cette aide n'est pas exaussive
et va ^etre complété avac les exemples les plus courants.
_______________________________________________________________________________
le fichier ~/expr.ini crée par défault sera :
1
source 1 =$HOME
destination 1 =/media/$(ls -rS /media/| head -1)$HOME
inclusions 1 =.
exclusions 1 =.backup.|.[Cc]ache.|.Trash.|.kde.|.Flash.|.thumbnails.|.share.|.mozilla.
"> ~/.backup/help.txt
cat ~/.backup/help.txt
fi
Je n'ai ni vraiment l'intention de faire des mises a jours fréquentes ni de recueillir des suggestions mais si vous pensé avoir résolu un bogue du script postez le au cas où...
PS : Pour afficher l'aide du script (pour l'installation) , ajoutez l'argument --help
J'oubliais : j'utilise xterm pour l'interface, c'est un terminal léger installé par défaut sur ubuntu...
Dernière modification par H.Dimitri (Le 29/06/2010, à 22:38)
Hors ligne