Rsync et script de sauvegarde

Bonjour à tous,

Voilà j'essaie d'améliorer mon petit script de sauvegarde avec rsync qui est tout simple, et j'aimerai surtout definir la liste des chemins à exclure avec une variable prédéfinie que j'imputerai à l'option "exclude" mais voilà ça ne fonctionne pas... Donc j'aimerai comprendre où est mon erreur, où bien tout simplement ce n'est pas possible avec les options?

Voici le script : 

#!/bin/bash

mkdir /mnt/source
mount /dev/mapper/linux /mnt/source/
LIST={@debian/@tmp/,@debian/@fsroot/dev/,@debian/@fsroot/proc/,@debian/@fsroot/sys/,@debian/@fsroot/run/,@debian/@fsroot/mnt/,@debian/@fsroot/media/,@debian/@fsroot/lost+found}
rsync --numeric-ids --devices --specials -A -X -H -W -a --info=progress2 --exclude=$LIST --delete /mnt/source/ /media/gogi/linux-backup/
umount /mnt/source && rmdir /mnt/source
exit 0

Bien entendu, si je rédige le script de la façon suivante ça fonctionne :

#!/bin/bash

mkdir /mnt/source
mount /dev/mapper/linux /mnt/source/
rsync --numeric-ids --devices --specials -A -X -H -W -a --info=progress2 --exclude={@debian/@tmp/*,@debian/@fsroot/dev/*,@debian/@fsroot/proc/*,@debian/@fsroot/sys/*,@debian/@fsroot/run/*,@debian/@fsroot/mnt/*,@debian/@fsroot/media/gogi/*,@debian/@fsroot/lost+found} --delete /mnt/source/ /media/gogi/linux-backup/
umount /mnt/source && rmdir /mnt/source
exit 0

Mais j’aimerai faire fonctionner la première idée pour une facilité de lecture entre la liste des chemins à exclure (et qui pourra être étendue à l’avenir qui sait…) et la commande rsync.

Je précise que je n’y connais pas grand chose en scripts. :frowning:

Je viens d’y penser, peut-etre que le sujet n’est pas au bon endroit et qu’il aurait du etre plus dans la categorie programmation? Si c’est le cas dites le moi que je le deplace.

Effectivement c’est plus de la programmation, pourquoi ne pas utiliser une variable pour tes exclusions, ainsi tu pourrais appelé un fichier texte dans lequel tu pourrais maintenir tes exclusions.

Mince je peux pas le deplacer moi-meme, il faut que ce soit un modo qui le fasse?

En ce qui concerne la variable c’est ce que je croyais faire en denommant “LIST” comme variable et en lui affectant “la liste” des chemins à exclure?

Pour ce qui est l’appel de fichier j’ai deja essaye, c’est faisable directement avec la commande rsync et l’option ‘–exclude-from=/chemin/de/mon/fichier/d’exclusion’, mais ce que je veux c’est conserver le tout dans un seul fichier comme ça lorsque j’aurai besoin de l’editer plus tard je saurai que tout est là…

Ce que je ne comprends pas c’est pourquoi si je mets la chaine de chemins directement dans la commande rsync ça marche, par contre si je mets cette chaine dans une variable (en l’occurence ici ‘LIST’) et que j’apelle cette variable juste apres dans la commande rsync, ça ne marche pas… Y’a quelque chose qui m’echappe ou bien rsync ne prend pas en consideration la variable telle quelle.

J’ai trouvé une alternative sur le net qui est la suivante :

#!/bin/bash

# Backup System Files
mkdir /mnt/source
mount /dev/mapper/linux /mnt/source/

EXCLUDE_LIST=(@debian/@tmp/* 
	      @debian/@fsroot/dev/* 
	      @debian/@fsroot/proc/* 
	      @debian/@fsroot/sys/* 
	      @debian/@fsroot/run/* 
	      @debian/@fsroot/mnt/* 
	      @debian/@fsroot/media/gogi/* 
	      @debian/@fsroot/lost+found
	      @debian/@home/gogi/.cache/chromium/Default/*
	      @debian/@home/gogi/.cache/icedove/*
	      @debian/@home/gogi/.cache/mozilla/firefox/*
	      @debian/@home/gogi/.cache/thumbnails/fail/gnome-thumbnail-factory/*
	      @debian/@home/gogi/.cache/thumbnails/large/*
	      @debian/@home/gogi/.cache/thumbnails/normal/*
	      @debian/@home/gogi/.thumbnails/normal/*
	     )

rsync --numeric-ids --devices --specials -A -X -H -W -av ${EXCLUDE_LIST[@]/#/--exclude=} --delete /mnt/source/ /media/gogi/linux-backup/

umount /mnt/source && rmdir /mnt/source

exit 0

où je passe la liste entre parenthèses, et l’expression qui fait appel à la liste dans la commande rsync est différente, et bon ça ça marche… Mais n’etant pas un crack en matiere de scripts j’aimerais vraiment comprendre pourquoi les premieres solutions ne marchent pas et ce que j’ai loupé…

C’est bon j’ai trouvé comment deplacer le sujet dans Programmation :smiley:

bonsoir,
pour l’info (qui vaut ce que ça vaut :stuck_out_tongue:)
j’utilise rsync pour faire un back-up de mon home

#!/bin/bash
rm /media/divers/rsync-home-sev-log/log-*
rsync -a --stats --human-readable --log-file=/media/divers/rsync-home-log/log.txt --log-file-format="" --del --ignore-errors --force -F /home/sev/ /media/divers/rsync-home-sev/ | tee -a /media/divers/rsync-home-log/log-`date +%Y%m%d-%H%M`.txt
sleep 1
echo -e "Mail envoyé le $(date)\n*************************\nLogs de sauvegarde rsync\n*************************\n`cat /media/divers/rsync-home-sev-log/log-*`" | mail -s "Logs de sauvegarde rsync" sev@pcsev.monhome

j’ai mis à la racine de mon home un fichier .rsync-filter
en ayant l’option -F dans ma commande rsync, il lit automatiquement mon fichier pour exclure certains fichiers / dossiers

- .iso
- .tmp
- lost+found/
- .Trash/
- .cache/
- .thumbnails/
- .clam-quarantaine
- .dbus
- .local/share/Trash
- .local/share/meld

tu peut aussi utiliser ce fichier pour inclure des fichiers / dossiers, il suffit de mettre + au lieu de - en début de ligne

bref, tout est dans le man rsync au niveau de la gestion des filtres :slight_smile:

Bonsoir Severian,

Oui ça ça marche car l’option -F appelle intrinsèquement la fonction ‘–filter’ et permet aussi bien d’inclure que d’exclure des fichiers et/ou dossiers. Et cette commande va chercher le fichier que tu as bien nommé ‘.rsync-filter’.

Mais ç’est justement ce dont je ne veux pas :stuck_out_tongue:
Enfin plutot je ne veux pas d’autre fichier que le script qui va me faire mon backup, et dans lequel j’ai tous mes chemins exclus passés à une variable.
Parce que tripatouilleur comme je suis, si je fais un fichier à part, aujourd’hui je vais savoir que j’ai fait un fichier en plus… Mais dans quelques mois si j’ai à revenir dessus, je vais sans doute passer un bout de temps pour me rappeler où je l’ai rangé :smiley:

C’est pour ça que j’ai fait un seul script que j’ai mis en executable et que j’ai rangé dans /usr/local/bin, comme ça lorsque je le lance dans un terminal, pas besoin de ‘sh fichier’ ou ‘./fichier’… Je tape directement le nom du fichier et c’est parti… :smiley:

D’ailleurs comme je l’ai dit la derniere solution que j’ai posté plus haut fonctionne et pour l’instant je me contenterai de ça, mais ce que je veux c’est comprendre maintenant ce qui cloche dans les deux premieres variantes que j’ai donné au début du sujet, pour que je comprenne si c’est mon script qui cloche ou bien si c’est rsync qui n’accepte pas le passage de l’option telle quelle.

Je ne sais pas si tu as vu celui que j’avais fait il y a quelques temps :
sauvegarde-ricardo

Salut Ricardo,

Je viens de jeter un oeil à ton script, et c’est pareil que ci-dessus, tu fais aussi référence à un fichier qui se trouve soit dans ton dossier utilisateur, soit dans le dossier administrateur, en fonction de ce qui est sauvegardé, et en utilisant l’option ‘–exclude-from=/chemin/de/mon/fichier’ :smiley:

Ce que je cherche à faire c’est me passer d’un fichier supplémentaire et inclure dans une variable placée dans le script directement, les chemins à exclure lors de la sauvegarde.
La dernière solution que j’ai présenté fonctionne très bien, mais la première du sujet ne fonctionne pas et c’est la que j’aimerai comprendre le pourquoi du comment.
Car n’étant pas un crack en matière de rédaction de scripts, le 1er modèle est ce qui me tombe facilement sous le sens ou plutôt ce que je suis pour l’instant capable de reproduire facilement… La 3e solution, qui est certes fonctionelle, je ne l’aurai pas trouvé tout seul, du moins pas à ce stade de mes connaissances.

OK, je n’avais lu qu’en diagonale.
Pas plus calé que toi en programmation :disappointed:

Pas de soucis :wink:
Par contre j’ai récupéré ton script qui m’intéresse quand même et je vais essayer d’en faire un script générique adapté et fonctionnel pour n’importe quelle configuration. Je proposerai le résultat ici quand ce sera opérationnel.

OK, je suivrai ça.

Salut,

si c’est bien juste pour exclure des fichiers, tu dois pouvoir utiliser - pour dire de lire l’entrée standard avec l’option exclude-from et faire en gros :
liste=$(cat <<-'FIN' /tmp /dev FIN ) echo "$list" | rsync --exclude-from=- --tes_autres_options source destination

Les guillemets pour le echo sont importants (je pense), pour FIN, tu peux mettre n’importe quoi tant que le début correspond à la fin :slight_smile:
Si tu as des questions sur tout ça, n’hésite pas (ou cherche here documents :slight_smile: sur ton moteur de recherche préféré).

Par contre, je ne comprends pas tes arobases dans ta EXCLUDE_LIST…

Je ne sais pas si ça peut marcher comme ça, “–exclude-from=” est conçu pour faire appel à un chemin de fichier, je ne sais pas s’il est capable de lire “-” qui appelerait “list” qui serait placé en début de script… À voir.

Les “@” sont là dans les noms de dossiers car je suis en btrfs, et ça me permet de distinguer un sous-volume btrfs d’un simple dossier. Pure convention de dénomination.

Pour --exclude-from, d’après le manuel :
--exclude-from=FILE This option is related to the --exclude option, but it specifies a FILE that contains exclude patterns (one per line). Blank lines in the file and lines starting with ’;’ or ’#’ are ignored. If FILE is -, the list will be read from standard input.

Donc ça doit pouvoir marcher :slight_smile:

Pour les @, merci, je comprends mieux :slight_smile:

Oui mais ça implique encore une fois d’écrire les 1ères lignes dans un AUTRE fichier, pas dans le script…
Or ce que je ne veux pas, c’est justement un autre fichier… :smiley:
Je veux que tout tienne dans le script.

" If FILE is -, the list will be read from standard input."

« - » est souvent utilisé pour désigner l’entrée standard à un endroit où on attend un fichier.

C’est ça qui est important…
Et il suffit de « echo “$list” | sync --exclude-from- …» pour s’en servir.

Je m’excuse, autant pour moi j’ai lu en diagonale, bon c’est à voir il faut tenter le coup.
Merci.

Pas de soucis :slight_smile: