Synchronisation bidirectionnelle avec rsync

95

J'ai un dossier a / et un dossier distant A /. Je lance maintenant quelque chose comme ça 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 de la musique sync, il obtient d'abord tous les diffs du serveur au local, puis l'inverse, en envoyant tous les diffs du local au serveur.

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

Dans rsync, il y a des options --delete et --delete-after pour aider à accomplir ce que je veux, mais le fait est que cela ne fonctionne pas sur une synchronisation bidirectionnelle.

Si je veux supprimer les fichiers du serveur sur une synchronisation, 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 sur le serveur mais qui existent localement et ils ont été supprimés, Je veux les supprimer localement et non le serveur copié (comme cela se produit).

Le fait est que j'ai 3 machines en contexte:

  1. bureau
  2. carnet
  3. serveur domestique

Ainsi, parfois, le serveur aura des fichiers qui ont été supprimés avec une synchronisation de bloc-notes, par exemple, puis, lorsque j'exécute une synchronisation avec mon bureau (où les fichiers de serveur supprimés existent toujours), je veux que ces fichiers soient supprimés et non copié à nouveau sur le serveur.

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

Des solutions plus simples? Je vous remercie.

mwm
la source
1
J'ai le même problème. Avez-vous trouvé une solution, mwm?
mouche le
7
je l'ai fait maintenant. J'essayais de réaliser une expérience semblable à une boîte de dépôt et j'ai proposé une solution qui implique l'unisson (qui utilise rsync) et lsyncd pour surveiller les modifications de fichiers. j'ai aussi trouvé d'autres personnes avec cette solution et plus d'astuces sur le dessus » cerebralmastication.com/2011/04/fast-two-way-sync-in-ubuntu
mwm
de nos jours, j'utilise nextcloud localement sur mon serveur domestique. parfaite solution "dropbox" 100% gérée par mes soins. a des clients android / ios / win / macos / linux / web.
mwm

Réponses:

63

Essayez Unison: http://www.cis.upenn.edu/~bcpierce/unison/

Syntaxe: unison dirA/ dirB/

Unison demande quoi 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 pour afficher le nombre de fichiers ignorés (car ils sont en conflit).

Alex
la source
7
Unison est assez facile à utiliser pour les petits répertoires. Mais il est extrêmement lent pour les répertoires avec un grand nombre de fichiers. Là où rsync commencera à copier presque immédiatement, l'unisson prend parfois plus de 12 heures pour commencer à copier, car il scanne chaque fichier avant de copier quoi que ce soit.
Brent Faust
1
Au moins, git est facile à utiliser et le transport est rapide.Pour blob, il existe une extension développée par github appelée Large File Storage .
wener
1
Les principaux problèmes de git sont des fichiers volumineux et qu'il est vraiment conçu pour les commits explicites. Les deux peuvent être raisonnablement améliorés par des add-ons tels que git-annex, le stockage de fichiers volumineux, etc.
alex
3
@wener N'utilisez pas de marteau pour une vis ou un tournevis pour un clou. :)
ADTC
2
l'unisson est excellent - mais aussi très peu fiable. Dans environ 50% de mes cas d'utilisation, cela n'a pas fonctionné. La cause la plus fréquente de ce problème est la faible capacité d'interversion. Je synchronise parfois avec du contenu sur un ordinateur sur lequel je n'ai aucun privilège. Si ce serveur a une version différente de la mienne, l'unisson échoue. De plus, je l'ai récemment fait échouer entre des clients unisson de la même version, car ils utilisaient différentes versions compilées d'une bibliothèque (c'était entre un ordinateur ubuntu et un raspberry pi).
argentum2f
5

Vous pouvez utiliser Osync: http://www.netpower.fr/osync , qui est basé sur rsync avec une propagation de suppression intelligente. il dispose également de plusieurs options telles que la reprise d'une exécution interrompue, la suppression logicielle et le contrôle du temps.

Orsiris de Jong
la source
5

Étant donné que la question originale implique également un ordinateur de bureau et un ordinateur portable et un exemple impliquant des fichiers musicaux (il utilise probablement une interface graphique), je mentionnerais également l'un des meilleurs programmes bidirectionnels, multi-plateformes, gratuits et open source à ce jour: FreeFileSync .

Il est basé sur une interface graphique, très rapide et intuitive, est livré avec un filtrage et de nombreuses autres options, y compris la possibilité de se connecter à distance, d'afficher et de gérer de manière interactive les «collisions» (par exemple, des fichiers avec des horodatages similaires) et de basculer entre le transfert bidirectionnel, la mise en miroir et bientôt.

Dario Fumagalli
la source
4

Essaye ç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 cela et cela a fonctionné pour moi. Je fais une synchronisation bidirectionnelle entre Windows7 (en utilisant cygwin avec le package rsync installé) et le serveur de fichiers FreeNAS (FreeNAS fonctionne sur FreeBSD avec le package rsync pré-installé).

Chris Collins
la source
3
Cela ne supprimera-t-il pas les nouveaux fichiers locaux? -uignore les fichiers plus récents sur la destination, mais rsync n'a pas de moyen de suivre l'âge d'une suppression, alors comment ce script pourrait-il différencier le moment où un fichier local est nouveau (et doit être conservé) ou ancien (et doit être supprimé) ? Ou suis-je mal compris?
Matthemattics
--delete-excludedSupprime- t-il les fichiers qui existent sur les répertoires de destination mais pas les répertoires source? Je pensais que vous deviez définir, --exclude=<filename>donc rsync ne supprimera-t-il pas uniquement ces exclusions? Ou est-ce que rsync traite tous les fichiers de répertoire non source comme "exclut"?
Mr_Moneybags
2
J'ai trouvé la réponse: en plus de supprimer les fichiers du côté de la réception qui ne sont pas du côté de l'envoi, cela indique à rsync de supprimer également tous les fichiers du côté de la réception qui sont exclus (voir --exclude) rsync.samba.org/ftp /rsync/rsync.html
Mr_Moneybags
2
D'après ce que j'ai compris, si je crée un fichier sur la destination, puis exécute la commande rsync pour copier de la source à la destination, cela supprimera le fichier à la destination, car aucun horodatage n'est utilisé. Ce n'est pas ce que tu veux, non?
elexhobby
10
@ Lübnah: c'est exact; cette solution n'est pas une synchronisation bidirectionnelle complète : car rsync with --delete-excludedest exécuté avec le serveur comme source en premier: les fichiers ajoutés localement seront supprimés pendant cette exécution (alors que les fichiers ajoutés au serveur sont copiés sur la cible locale). Les seuls fichiers locaux synchronisés avec le serveur sont des fichiers qui existent également sur le serveur et qui ont été modifiés localement (plus récemment que les versions du serveur) - ce qui est peu probable dans le scénario du PO. Comme vous le suggérez, methinks une véritable synchronisation bidirectionnelle ne peut pas être effectuée rsync, car l'enregistrement de l'état entre les exécutions est nécessaire.
mklement0
3

Vous pouvez essayer csync , c'est le moteur de synchronisation sous le capot d' owncloud .

marton78
la source
2
À partir de 2018, le développement de csync semble s'être bloqué et owncloud a l'air de le forger. Voir: github.com/owncloud/client/issues/4661 pour plus de détails
Aaron
1

J'utilise maintenant SparkleShare https://www.sparkleshare.org/

fonctionne sur mac, linux et windows.

mwm
la source
au fil du temps, je continue de mettre à jour ma solution. J'utilise maintenant nextcloud sur mon serveur domestique. synchronisation avec le client nextcloud sur linux, mac, windows, android et ios.
mwm
0

Je ne sais pas si cela fonctionne avec deux synchronisations, mais pour que --delete fonctionne, vous devez également ajouter le paramètre --recursive.

Boardy
la source
1
En bref , l' équivalent de l' option --recurseest -rque l'OP est utilise (incorporé dans le groupe-options comprimé -avzru).
mklement0
0

Vous pouvez utiliser cloudsync pour garder un dossier synchronisé avec une télécommande:

pip install cloudsync
pip install cloudsync-gdrive
cloudsync sync file:c:/users/me/documents gdrive:/mydocs

Si la télécommande est NFS, vous pouvez utiliser:

cloudsync sync file:c:/users/me/documents/ file:/mnt/nfs/whatevs
Erik Aronesty
la source
-1

Rclone est ce que vous recherchez. Rclone («rsync for cloud storage») est un programme en ligne de commande pour synchroniser des fichiers et des répertoires vers et depuis différents fournisseurs de stockage cloud, y compris les systèmes de fichiers locaux. Rclone était auparavant connu sous le nom de Swiftsync et est disponible depuis 2013.

user1461607
la source
Il ne prend pas en charge la synchronisation bidirectionnelle: rclone.org/commands/rclone_sync
Martin Braun