102 votes

Synchronisation à double sens avec rsync

J'ai un dossier a/ et un dossier distant A/. Je lance maintenant quelque chose comme ceci sur un Makefile :

get-music:
 rsync -avzru server:/media/10001/music/ /media/Incoming/music/

put-music:
 rsync -avzru /media/Incoming/music/ server:/media/10001/music/

sync-music: get-music put-music

quand je fais sync-music, il récupère d'abord toutes les diffs du serveur vers le local et ensuite l'inverse, en envoyant toutes les diffs du local vers le serveur.

Cela ne fonctionne très bien que s'il n'y a que des mises à jour ou de nouveaux fichiers dans le futur. S'il y a des suppressions, cela ne fait rien.

Dans rsync, il existe des options --delete et --delete-after qui permettent d'accomplir ce que je veux, mais le problème est que cela ne fonctionne pas sur une synchronisation à deux voies.

Si je veux supprimer les fichiers du serveur sur un syn, lorsque les fichiers locaux ont été supprimés, cela fonctionne, mais si, pour une raison quelconque (expliquée après), j'ai des fichiers qui ne sont pas dans le serveur mais existent localement et qu'ils ont été supprimés, je veux que ce soit localement qui les supprime et non pas copiés sur le serveur (comme cela arrive).

Le problème est que j'ai 3 machines en contexte :

  1. bureau
  2. ordinateur portable
  3. serveur domestique

Ainsi, il arrive que le serveur contienne des fichiers qui ont été supprimés lors d'une synchronisation de l'ordinateur portable, par exemple, et lorsque je lance une synchronisation avec mon ordinateur de bureau (sur lequel les fichiers supprimés du serveur existent toujours), je veux que ces fichiers soient supprimés et ne soient pas recopiés sur le serveur.

Je suppose que cela n'est possible qu'avec une base de données et un suivi des opérations :P

Y a-t-il des solutions plus simples ? Merci.

66voto

alex Points 3964

Essayez l'unisson : http://www.cis.upenn.edu/~bcpierce/unison/

Syntaxe : unison dirA/ dirB/

Unison demande ce qu'il faut faire lorsque les fichiers sont différents, mais vous pouvez automatiser le processus en utilisant ce qui suit qui accepte les options par défaut (non conflictuelles) :

unison -auto dirA/ dirB/

unison -batch dirA/ dirB/ ne pose aucune question, et écrit en sortie combien de fichiers ont été ignorés (parce qu'ils étaient en conflit).

8voto

saif Points 103

Vous pouvez également essayer bitpocket : https://github.com/sickill/bitpocket

6voto

Chris Collins Points 112

Essayez ça,

get-music:
 rsync -avzru --delete-excluded server:/media/10001/music/ /media/Incoming/music/

put-music:
 rsync -avzru --delete-excluded /media/Incoming/music/ server:/media/10001/music/

sync-music: get-music put-music

Je viens de tester ceci et cela a fonctionné pour moi. Je fais une synchronisation à double sens entre Windows7 (utilisant cygwin avec le paquetage rsync installé) et le serveur de fichiers FreeNAS (FreeNAS fonctionne sous FreeBSD avec le paquetage rsync pré-installé).

5voto

deajan Points 18

Vous pourriez utiliser Osync : http://www.netpower.fr/osync Il dispose également de plusieurs options comme la reprise d'une exécution interrompue, la suppression douce et le contrôle du temps.

3voto

marton78 Points 1067

Vous pouvez essayer csync il s'agit du moteur de synchronisation sous le capot de owncloud .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X