RSync: Wie synchronisiere ich in beide Richtungen?

82

Ich möchte rsync verwenden, um zwei Verzeichnisse in beide Richtungen zu synchronisieren .

Ich beziehe mich auf die Synchronisation im klassischen Sinne ( nicht wie es in rsync-Handbüchern gemeint ist):
Ich möchte die Verzeichnisse in beide Richtungen aktualisieren , je nachdem, welches davon neuer ist .

Kann dies mit rsync erfolgen (vorzugsweise auf Linux-Weise) ?
Wenn nicht, welche anderen Lösungen gibt es?

java.is.for.desktop
quelle
3
Ich glaube, dass Sie in serverfault.com bessere Antworten erhalten.
Esteban Küber

Antworten:

77

Führen Sie es einfach zweimal aus, mit dem "neueren" Modus (-u oder --update flag) plus -t (zum Kopieren der Änderungszeit der Datei), -r (für rekursive Ordner) und -v (für die ausführliche Ausgabe, um zu sehen, was es ist tun):

rsync -rtuv /path/to/dir_a/* /path/to/dir_b
rsync -rtuv /path/to/dir_b/* /path/to/dir_a

Löschvorgänge werden hiermit nicht behandelt, aber ich bin mir nicht sicher, ob es eine gute Lösung für dieses Problem gibt, wenn nur regelmäßig synchronisiert wird.

jsight
quelle
3
Da es sich bei der Frage um rsync handelte, werde ich diese Antwort als richtig markieren.
java.is.for.desktop
2
Aber Sie haben auch nach anderen Lösungen gefragt und Unison macht einen besseren Job, sonst würde ich nie ein anderes Tool erwähnen. Ich verstehe, dass Sie möglicherweise bestimmte Umstände haben, die die Verwendung von rsync begünstigen.
MaD70
1
Meine Güte, du bekommst 6 positive Stimmen und beschwerst dich immer noch? <j / k> Unison ist eine wirklich interessante Lösung, und ich bin froh, dass Sie sie erwähnt haben. :)
jsight
2
Nun, ich beschwere mich nicht, ich erkläre. Nur um zu überprüfen, ob mir etwas fehlt (ich bin kein englischer Muttersprachler).
MaD70
1
MaD70 - Kein Problem ... Ich habe nur Spaß gemacht. :)
jsight
63

Kennen Sie Unison File Synchronizer ?

Unison ist ein Dateisynchronisierungstool für Unix und Windows. Damit können zwei Replikate einer Sammlung von Dateien und Verzeichnissen auf verschiedenen Hosts (oder verschiedenen Festplatten auf demselben Host) gespeichert, separat geändert und dann auf den neuesten Stand gebracht werden, indem die Änderungen in jedem Replikat auf das andere übertragen werden. ...

Beachten Sie auch, dass es ausfallsicher ist:

Unison ist widerstandsfähig gegen Versagen. Es ist darauf zu achten, dass die Replikate und ihre eigenen privaten Strukturen jederzeit in einem vernünftigen Zustand sind, auch bei abnormaler Beendigung oder Kommunikationsfehlern.

MaD70
quelle
2
+1. Unison ist der beste Weg, dies zu tun. Double-rsync ist schwer zu korrigieren und verarbeitet Löschvorgänge überhaupt nicht.
Avdi
Ja, Unison ist fehlerresistent. Ich aktualisiere meine Antwort, um dies zu betonen.
MaD70
4
Hatte noch nichts von Unison gehört. Sie sind dafür verantwortlich, dass ich meine Backup-Skripte heute zu Hause wiederhole.
Esteban Küber
1
Ich bin froh, dass meine Antwort so nützlich ist (dies zeigt, wie praktisch ein Werkzeug sein kann, das auf einer soliden theoretischen Grundlage basiert).
MaD70
Hier ist ein kurzes Tutorial zu Unison im Linuxjournal.
Lepe
12

Sie müssen rsynczweimal ausführen, und ich empfehle, es auszuführen mit -au:

rsync -au /local/source/* /remote/destination
rsync -au /remote/destination/* /local/source

-a(a für Archiv) ist eine Verknüpfung für -rlptgoD:

  • -r In Unterverzeichnisse zurückgreifen
  • -l Synchronisieren Sie auch symbolische Links
  • -p Synchronisieren Sie auch Dateiberechtigungen
  • -t Synchronisieren Sie auch die Änderungszeiten der Dateien
  • -g Synchronisieren Sie auch Dateigruppen
  • -o Synchronisieren Sie auch den Dateibesitzer
  • -D Synchronisieren Sie auch spezielle (nicht reguläre / Meta) Dateien

Grundsätzlich sollten Sie immer dann, wenn Sie eine identische Eins-zu-Eins-Kopie mit erstellen möchten, diese rsyncverwenden, -ada dies die meisten Benutzer erwarten, wenn sie über " Synchronisierung " sprechen . Andere Antworten hier scheinen zu übersehen, dass der Inhalt einer Datei manchmal unverändert bleibt, sich jedoch möglicherweise der Eigentümer oder die Zugriffsberechtigungen geändert haben, und in diesem Fallrsync die Datei nicht synchronisiert werden, was schwerwiegend sein könnte.

Sie müssen jedoch auch angeben -u, dass rsyncalle Dateien / Ordner vollständig in Ruhe gelassen werden sollen, falls sie bereits am Ziel vorhanden sind und ein neueres Datum für die letzte Änderung haben. Ohne -u rsyncwürde synchronisieren, unabhängig davon, ob eine Datei / ein Ordner neuer ist oder nicht .

Bitte beachten Sie, dass diese Lösung gelöschte Dateien nicht verarbeiten kann. Das Behandeln von Löschvorgängen ist unter Berücksichtigung der folgenden Situation nicht einfach möglich: Eine Datei wurde an der Quelle gelöscht. Wie soll nun festgestellt werden rsync, ob diese Datei einmal vorhanden und gelöscht wurde (in diesem Fall muss sie auch am Zielort gelöscht werden) oder ob Es war nie an der Quelle vorhanden (in diesem Fall muss es vom Ziel kopiert werden). Diese beiden Situationen sehen identisch aus rsyncund können daher nicht richtig reagieren. Es hilft nicht, umgekehrt zu synchronisieren, da dies zu derselben Situation führen kann: Eine Datei ist an der Quelle vorhanden, jedoch nicht am Ziel. Warum? Hat es am Zielort noch nie existiert oder wurde es gelöscht? Beide Fälle sehen identisch aus mit rsync.

Synchronisierungstools, mit denen gelöschte Dateien zuverlässig synchronisiert werden können, verwalten normalerweise ein Synchronisierungsprotokoll über alle früheren Synchronisierungsvorgänge. Wenn aus diesem Protokoll hervorgeht, dass einmal eine Datei vorhanden war und synchronisiert wurde, diese aber jetzt fehlt, ist klar, dass sie gelöscht wurde. Wenn es laut Protokoll nie eine solche Datei gab, muss sie synchronisiert werden. Durch das Speichern aller Protokolleinträge mit Zeitstempeln ist es sogar möglich, dass eine gelöschte Datei zurückkommt und mehrmals gelöscht wird. Das Synchronisierungstool weiß jedoch immer, was zu tun ist, und das Ergebnis ist immer korrekt. rsynchat kein solches Protokoll, es stützt sich nur auf den aktuellen Dateistatus von zwei Seiten des Vorgangs.

Sie können sich jedoch selbst einen Synchronisierungsbefehl mit rsyncund ein wenig POSIX-Shell-Scripting erstellen , das einem Synchronisierungstool wie oben beschrieben bereits sehr nahe kommt. Da ich selbst ein solches Tool benötigte, finden Sie hier eine Antwort auf Stackoverflow , die Sie durch die Erstellung eines solchen Skripts führt.

Mecki
quelle
Schön ausgedrückt.
Peter Rowntree
6

Danke jsight

rsync -urv --progress dir_a dir_b && rsync -urv  --progress dir_b dir_a

Dies würde dazu führen, dass die zweite Synchronisierung unmittelbar nach dem Ende der ersten Synchronisierung erfolgt. Wenn die Verzeichnisstruktur sehr groß ist, spart dies Zeit, da man nicht vor dem PC sitzen muss. Wenn die Struktur sehr groß ist, entfernen Sie das ausführliche und fortschreitende Material

rsync -ur dir_a dir_b && rsync -ur dir_b dir_a
Mayank Agarwal
quelle
1
Ich frage mich nur, ob ich -t hinzufügen soll, um die Änderungszeit der Datei zu kopieren. Gibt es einen Grund, warum ich -t weglassen sollte?
Chrips
@Chrips Nein, das glaube ich nicht. Es scheint, dass der Zweck dieser Antwort nur darin bestand zu zeigen, dass Sie &&zwischen den beiden Befehlen den 2. Befehl unmittelbar nach dem 1. Befehl automatisch ausführen können (wenn der 1. Befehl erfolgreich ist), anstatt ihn manuell nacheinander auszuführen in der Antwort von @ jsight. Ich denke auch, dass die Antwort von @ jsight so bearbeitet wurde, dass sie die -tOption enthält, nachdem diese Antwort veröffentlicht wurde.
Ruben9922
1

Verwenden rsync <OPTIONS> [hostname:]source-dir [hostname:]dest-dir

zum Beispiel:

rsync -pogtEtvr --progress --bwlimit=2000 xxx-files different-stuff

Synchronisiert xxx-Dateien mit verschiedenen / xxx-Dateien. Wenn verschiedene / xxx-Dateien nicht vorhanden waren, wird sie erstellt - dh kopiert.

-pogtEtv - Nur eine Reihe von Optionen zum Beibehalten von Dateimetadaten sowie v - ausführlich und r - rekursiv

--progress - Zeigt den Fortschritt der Synchronisierung in Echtzeit an - sehr nützlich, wenn Sie große Dateien kopieren

--bwlimit=2000 - legt die maximale Kopier- / Synchronisierungsgeschwindigkeit fest (bw = Bandbreite)

PS rsync ist von entscheidender Bedeutung, wenn Sie über ein Netzwerk arbeiten. Bei lokalen Computern können Sie Befehle wie cp verwenden .

Viel Glück!

Bohdan
quelle
0

Ich benutze rsyncmit inotifywait. Wenn Sie eine Datei ändern, rsyncwird ausgeführt.

inotifywait -m --exclude "$_LOG_FILE" -r -e create,delete,delete_self,modify,moved_to --format "%w%f" "$folder"

Sie müssen inotifywaitauf beiden Hosts ausgeführt werden. Bitte überprüfen Sie das Beispiel inotifywait

ich füge hinzu
quelle
0

Was Sie brauchen, ist Rclone . Rclone ("rsync for cloud storage") ist ein Linux-Befehlszeilenprogramm zum Synchronisieren von Dateien und Verzeichnissen mit und von verschiedenen Cloud-Speicheranbietern (Box, Dropbox, FTP usw.) und lokalen Dateisystemen. Rlone unterstützt nur die Spiegelsynchronisierung.

Eine andere grafischere Lösung, die eine Echtzeitsynchronisierung umfasst, wäre die Verwendung von FreeFileSync , das das Programm RealTimeSync enthält. FreefileSync unterstützt bidirektionale bidirektionale Synchronisierung, einschließlich der Behandlung von Löschvorgängen.

FreFileSync GUI

user1461607
quelle