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 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