Zweiwege-Synchronisierung mit rsync


95

Ich habe einen Ordner a / und einen Remote-Ordner A /. Ich führe jetzt so etwas auf einem Makefile aus:

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

Wenn ich Sync-Musik mache, werden zuerst alle Unterschiede von Server zu lokal und dann das Gegenteil abgerufen, wobei alle Unterschiede von lokal zu Server gesendet werden.

Dies funktioniert nur sehr gut, wenn es in Zukunft nur Updates oder neue Dateien gibt. Wenn es Löschungen gibt, macht es nichts.

In rsync gibt es die Optionen --delete und --delete-after, um das zu erreichen, was ich will, aber die Sache ist, dass es bei einer 2-Wege-Synchronisierung nicht funktioniert.

Wenn ich Serverdateien auf einer Synchronisierung löschen möchte, wenn lokale Dateien gelöscht wurden, funktioniert dies, aber wenn ich aus irgendeinem Grund (nachfolgend erläutert) einige Dateien habe, die nicht auf dem Server sind, aber lokal vorhanden sind und gelöscht wurden, Ich möchte sie lokal entfernen und nicht vom Server kopieren (wie es passiert).

Ich habe 3 Maschinen im Kontext:

  1. Desktop
  2. Notizbuch
  3. Heimserver

Manchmal hat der Server also Dateien, die beispielsweise mit einer Notebook-Synchronisierung gelöscht wurden. Wenn ich dann eine Synchronisierung mit meinem Desktop durchführe (auf dem die gelöschten Serverdateien noch vorhanden sind), möchte ich, dass diese Dateien gelöscht werden und nicht erneut auf den Server kopiert.

Ich denke, dies ist nur mit einer Datenbank und einer Verfolgung der Operationen möglich: P.

Einfachere Lösungen? Danke dir.


1
Ich habe das gleiche Problem. Hast du eine Lösung gefunden, mwm?
Mouche

7
Ich habe es jetzt tatsächlich getan. Ich habe versucht, eine Dropbox-ähnliche Erfahrung zu erzielen, und eine Lösung gefunden, die Unison (mit rsync) und lsyncd zur Überwachung von Dateiänderungen umfasst. Ich fand auch andere Leute mit dieser Lösung und mehr Tricks oben » cerebralmastication.com/2011/04/fast-two-way-sync-in-ubuntu
mwm

Heutzutage verwende ich nextcloud lokal auf meinem Heimserver. perfekte "dropbox" sollution 100% von mir verwaltet. hat android / ios / win / macos / linux / web clients.
MWM

Antworten:


63

Versuchen Sie es mit Unison: http://www.cis.upenn.edu/~bcpierce/unison/

Syntax: unison dirA/ dirB/

Unison fragt, was zu tun ist, wenn Dateien unterschiedlich sind. Sie können den Vorgang jedoch automatisieren, indem Sie Folgendes verwenden, das Standardoptionen (ohne Konflikte) akzeptiert:

unison -auto dirA/ dirB/

unison -batch dirA/ dirB/ stellt überhaupt keine Fragen und schreibt, um auszugeben, wie viele Dateien ignoriert wurden (weil sie in Konflikt standen).


7
Unison ist ziemlich einfach für kleine Verzeichnisse zu verwenden. Für Verzeichnisse mit einer großen Anzahl von Dateien ist es jedoch äußerst langsam. Wenn rsync fast sofort mit dem Kopieren beginnt, dauert es manchmal mehr als 12 Stunden, bis unisono mit dem Kopieren begonnen wird, da jede Datei gescannt wird, bevor etwas kopiert wird.
Brent Faust

1
Zumindest ist Git einfach zu bedienen und der Transport ist schnell. Für Blob gibt es eine von Github entwickelte Erweiterung namens Large File Storage .
Wener

1
Hauptprobleme von Git sind große Dateien und dass es wirklich für explizite Commits ausgelegt ist. Beide können durch Add-Ons wie Git-Annex, großen Dateispeicher usw. einigermaßen verbessert werden
Alex

3
@wener Verwenden Sie keinen Hammer für eine Schraube oder einen Schraubendreher für einen Nagel. :)
ADTC

2
unisono ist toll - aber auch sehr unzuverlässig. In ungefähr 50% meiner Anwendungsfälle hat es einfach nicht funktioniert. Die häufigste Ursache hierfür ist eine schlechte Interversionsfähigkeit. Ich synchronisiere manchmal mit Inhalten auf einem Computer, für den ich keine Berechtigungen habe. Wenn dieser Server eine andere Version als ich hat, schlägt unison fehl. Außerdem ist es kürzlich zwischen Unison-Clients derselben Version fehlgeschlagen, weil sie unterschiedliche kompilierte Versionen einer Bibliothek verwendeten (dies war zwischen einem Ubuntu-Computer und einem Himbeer-Pi).
argentum2f


5

Sie können Osync verwenden: http://www.netpower.fr/osync , das auf rsync mit intelligenter Löschausbreitung basiert. Es gibt auch mehrere Optionen wie die Wiederaufnahme einer angehaltenen Ausführung, das weiche Löschen und die Zeitsteuerung.


5

Da die ursprüngliche Frage auch einen Desktop und einen Laptop sowie ein Beispiel für Musikdateien umfasst (daher verwendet er wahrscheinlich eine grafische Benutzeroberfläche), würde ich auch eines der besten bidirektionalen, plattformübergreifenden, kostenlosen und Open-Source-Programme erwähnen : FreeFileSync .

Es ist GUI-basiert, sehr schnell und intuitiv, bietet Filterung und viele andere Optionen, einschließlich der Möglichkeit, eine Remoteverbindung herzustellen, "Kollisionen" anzuzeigen und interaktiv zu verwalten (z. B. Dateien mit ähnlichen Zeitstempeln) und zwischen bidirektionaler Übertragung, Spiegelung und zu wechseln demnächst.


4

Versuche dies,

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

Ich teste das einfach und es hat bei mir funktioniert. Ich führe eine bidirektionale Synchronisierung zwischen Windows7 (unter Verwendung von Cygwin mit installiertem rsync-Paket) und FreeNAS-Dateiserver (FreeNAS läuft unter FreeBSD mit vorinstalliertem rsync-Paket) durch.


3
Löscht dies nicht neue lokale Dateien? -uÜberspringt neuere Dateien am Ziel, aber rsync kann das Alter eines Löschvorgangs nicht verfolgen. Wie kann dieses Skript also unterscheiden, ob eine lokale Datei neu ist (und beibehalten werden sollte) oder alt ist (und gelöscht werden sollte)? ? Oder verstehe ich falsch?
Matthemattics

Enthält --delete-excludedlöschen Sie alle Dateien , die auf Zielverzeichnisse existieren , aber nicht Quellverzeichnisse? Ich dachte, Sie --exclude=<filename>müssten definieren, damit rsync nicht nur diese Ausschlüsse löscht? Oder behandelt rsync alle Nicht-Quellverzeichnisdateien als "ausgeschlossen"?
Mr_Moneybags

2
Die Antwort gefunden: Zusätzlich zum Löschen der Dateien auf der empfangenden Seite, die nicht auf der sendenden Seite sind, weist dies rsync an, auch alle Dateien auf der empfangenden Seite zu löschen, die ausgeschlossen sind (siehe --exclude). Rsync.samba.org/ftp /rsync/rsync.html
Mr_Moneybags

2
Soweit ich weiß, wird die Datei am Ziel gelöscht, wenn ich eine Datei auf dem Ziel erstelle und dann den Befehl rsync ausführe, um von der Quelle zum Ziel zu kopieren, da keine Zeitstempel verwendet werden. Das ist nicht was du willst, oder?
elexhobby

10
@ Lübnah: Richtig; Diese Lösung ist nicht eine volle 2-Wege - Synchronisierung : Da rsync mit --delete-excludeddem ausgeführt wird Server als Quelle zuerst: Dateien lokal hinzugefügt werden gelöscht während dieses Laufes (während Dateien auf den zusätzlichen Server werden auf das lokale Ziel kopiert). Die einzigen lokalen Dateien, die wieder mit dem Server synchronisiert werden, sind Dateien, die ebenfalls auf dem Server vorhanden sind und lokal geändert wurden (in jüngerer Zeit als die Serverversionen) - was im OP-Szenario nicht wahrscheinlich ist. Wie Sie andeuten, kann eine echte 2-Wege-Synchronisierung nicht durchgeführt werden rsync, da das Speichern des Status zwischen den Läufen erforderlich ist.
mklement0


1

Ich verwende jetzt SparkleShare https://www.sparkleshare.org/

funktioniert unter Mac, Linux und Windows.


Mit der Zeit aktualisiere ich meine Lösung ständig. Ich verwende jetzt nextcloud auf meinem Heimserver. Synchronisierung mit dem nextcloud-Client unter Linux, Mac, Windows, Android und iOS.
MWM

0

Ich bin nicht sicher, ob es mit zwei Synchronisierungen funktioniert, aber damit --delete funktioniert, müssen Sie auch den Parameter --recursive hinzufügen.


1
Die kurze äquivalent Option --recurseist -r, die die OP wird unter Verwendung von (in Druckoptionen Gruppe eingebettet -avzru).
mklement0

0

Sie können Cloudsync verwenden , um einen Ordner mit einer Fernbedienung synchron zu halten:

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

Wenn die Fernbedienung NFS ist, können Sie Folgendes verwenden:

cloudsync sync file:c:/users/me/documents/ file:/mnt/nfs/whatevs

-1

Rclone ist das, wonach Sie suchen. Rclone ("rsync for cloud storage") ist ein Befehlszeilenprogramm zum Synchronisieren von Dateien und Verzeichnissen mit und von verschiedenen Cloud-Speicheranbietern, einschließlich lokaler Dateisysteme. Rclone war zuvor als Swiftsync bekannt und ist seit 2013 verfügbar.


Es unterstützt keine bidirektionale
Martin Braun
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.