2010-05-29 20 views
78

Ich habe einen Ordner a/und einen Remote-Ordner A /. Ich laufe nun so etwas wie dies auf einem Makefile:Zwei-Wege-Synchronisierung mit rsync

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 zu machen, es werden zuerst alle diffs vom Server an den lokalen und dann das Gegenteil, alle Differentiale von lokalen Server sendet.

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

In rsync gibt es --delete und --delete-nach Optionen zu erreichen, was ich will, aber Sache ist, funktioniert es nicht auf einer 2-Wege-Sync.

Wenn ich Serverdateien auf einem Syn löschen möchte, wenn lokale Dateien gelöscht wurden, funktioniert es, aber wenn, aus irgendeinem Grund (später erklärt) ich einige Dateien habe, die nicht auf dem Server existieren aber lokal und Sie wurden gelöscht, ich möchte sie lokal entfernen und nicht den Server kopieren (wie es passiert).

Sache ist, ich habe drei Maschinen im Kontext:

  1. Desktop
  2. Notebook
  3. Home-Server

Also, manchmal wird die Server-Dateien, die mit einem Notebook gelöscht wurden Zum Beispiel, und dann, wenn ich eine Synchronisierung mit meinem Desktop durchführe (wo die gelöschten Serverdateien noch vorhanden sind) möchte ich, dass diese Dateien gelöscht werden und nicht erneut auf den Server kopiert werden.

Ich denke, das mit einer Datenbank nur möglich ist, und Spur von Operationen: P

Noch einfachere Lösungen? Danke.

+1

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

+2

leider nicht. – mwm

+7

tat ich jetzt tatsächlich. Ich habe versucht, eine Dropbox wie Erfahrung zu erreichen und kam mit einer Lösung, die unison (die rsync verwendet) und lsyncd für die Überwachung von Dateiänderungen. Ich fand auch andere Leute mit dieser Lösung und mehr Tricks an der Spitze »http://www.cerebralmastication.com/2011/04/fast-twoway-sync-in-ubuntu/ – mwm

Antwort

54

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

Syntax: unison dirA/ dirB/

Unison, was zu tun fragt, wann Dateien unterschiedlich sind, aber Sie können den Prozess automatisieren, indem Sie die folgende Verwendung der Standard (nonconflicting) Optionen akzeptiert:

unison -batch dirA/ dirB/ fragt überhaupt keine Fragen und schreibt, wie viele Dateien w ausgegeben werden Wird ignoriert (weil sie in Konflikt geraten).

+0

Übrigens, wenn Sie denken, dass Sie sind auf rsync beschränkt, weil Sie nicht genügend Rechte haben, um Unison zu installieren - [Sie können immer noch unison mit dem Präfix installieren] (http://i3vi3v.wordpress.com/2013/01/09/zend-studio-syncing -files-with-remote-Server-Verwendung-Unison /). – Igor

+6

Unison ist ziemlich einfach für kleine Verzeichnisse zu verwenden. Aber es ist unerträglich langsam für Verzeichnisse mit einer großen Anzahl von Dateien. Wenn rsync fast sofort mit dem Kopieren beginnt, benötigt Unison manchmal mehr als 12 Stunden, um mit dem Kopieren zu beginnen, da jede Datei vor dem Kopieren gescannt wird. –

+1

Es git gut darin zumindest git ist einfach zu bedienen und der Transport ist schnell.für Blob gibt es eine Erweiterung von github entwickelt namens [Large File Storage] (https://git-lfs.github.com). – wener

0

Ich bin nicht sicher, ob es funktioniert mit zwei Synchronisierung aber für die --delete Sie auch auch die --recursive Parameter hinzufügen müssen arbeiten.

+0

Das Kurzäquivalent der Option '--recurse' ist' -r', das das OP _is_ benutzt (eingebettet in die komprimierte Optionsgruppe '-avzru'). – mklement0

5

die Sie interessieren,

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 diese gerade und es funktionierte für mich. Ich mache eine 2-Wege-Synchronisation zwischen Windows7 (mit Cygwin mit dem Rsync-Paket installiert) und FreeNAS-Fileserver (FreeNAS läuft auf FreeBSD mit Rsync-Paket vorinstalliert).

+3

Löscht das nicht neue lokale Dateien? '-u' überspringt Dateien, die auf dem Ziel neu sind, aber rsync hat keine Möglichkeit, das Alter eines Löschvorgangs zu verfolgen. Wie kann dieses Skript also unterscheiden, ob eine lokale Datei neu (und beizubehalten) oder alt (und sollte gelöscht werden)? Oder bin ich falsch verstanden? – Matthematics

+0

Hat '--delete-excluded' alle Dateien löschen, die auf Zielverzeichnisse existieren, aber nicht Quellverzeichnisse? Ich dachte, Sie zu definieren, hatte '--exclude = ' so wird nicht nur diese umfasst nicht löschen rsync? Oder behandelt Rsync alle Nicht-Quellverzeichnisdateien als "ausgeschlossen"? –

+2

Können Sie die Antwort: Zusätzlich zu den Dateien auf der Empfangsseite zu löschen, die nicht auf der Sendeseite sind, sagt diese rsync auch alle Dateien auf der Empfangsseite zu löschen, die (siehe --exclude) http ausgeschlossen sind: // rsync.samba.org/ftp/rsync/rsync.html –

5

Sie könnten Osync verwenden: http://www.netpower.fr/osync, die rsync basiert mit intelligenter Deletion Propagation ist. Es hat auch mehrere Optionen wie Fortsetzen einer angehaltenen Ausführung, weiche Löschung und Zeitsteuerung.

3

Da die ursprüngliche Frage auch einen Desktop und Laptop und ein Beispiel für Musikdateien beinhaltet (daher benutzt er wahrscheinlich eine GUI), würde ich auch eines der besten bidirektionalen, Multi-Plattform-, freien und Open-Source-Programme erwähnen bis heute: FreeFileSync.

Es ist GUI-basiert, sehr schnell und intuitiv, kommt mit Filterung und vielen anderen Optionen, einschließlich der Fähigkeit, Remote-Verbindung, um "Kollisionen" (zum Beispiel Dateien mit ähnlichen Zeitstempeln) anzuzeigen und interaktiv zu verwalten und zwischen bidirektionalen zu wechseln Übertragung, Spiegelung und so weiter.