bidirektionale Synchronisation mit rsync

11

Ich versuche, eine bidirektionale oder bidirektionale Synchronisierung mit rsync einzurichten. In meinem Fall muss ich die Dateien nur löschen, wenn ich von B nach A synchronisiere. Daher habe ich mir überlegt, rsync zweimal wie folgt auszuführen:

rsync -rtuv ./A/ ./B/
rsync -rtuv --delete ./B/ ./A/

Dieses Problem bei dieser Lösung besteht darin, dass beim Ausführen von rsync (B-> A), das direkt nach dem Ausführen von rsync (AB) ausgeführt wird, alle neuen Dateien, die zwischen der Synchronisierung erstellt werden, ebenfalls entfernt werden.

Gibt es eine Möglichkeit, einen Zeitstempel als Bedingung anzugeben, dass die Datei nur gelöscht wird, wenn sie vor diesem Datum / dieser Uhrzeit erstellt wurde?

Aktualisiert:

Ich verstehe, dass es eine unisono Lösung gibt, aber das Problem mit unison muss an beiden Enden installiert werden. Ich synchronisiere mit einem Remote-Server und kann nicht unisono auf dem Remote-Ende installieren.

Raza
quelle
Es gibt eine sehr ähnliche Frage mit einigen weiteren Antworten hier: stackoverflow.com/questions/2936627/two-way-sync-with-rsync
Thomas

Antworten:

4

Sie können osync ausprobieren, das genau für diese Aufgabe entwickelt wurde. Ich habe einmal eine komplexe Folge von rsync-Befehlen eingerichtet, um den Job zu erledigen, aber jetzt verwende ich osync.

https://github.com/deajan/osync

Es verwendet rsync intern, daher sollte es für jede Situation geeignet sein, in der Sie rsync verwenden könnten.

Mark Perryman
quelle
1
Danke, Mark. Ich wollte gerade meine eigene Frage beantworten. Ich fand ein sehr ähnliches Skript namens bsync ( github.com/dooblem/bsync ), das im Grunde genommen diff verwendet, um herauszufinden, was synchronisiert werden muss. Da ich keine Synchronisierungskonflikte erwarte, ändere ich dieses Skript auch ein wenig, damit es im Hintergrund ausgeführt wird, wenn es mit einem Cron-Job ausgeführt wird.
Raza
7

rsyncist das falsche Werkzeug für diese Aufgabe, genau aus den Gründen, auf die Sie gestoßen sind. Verwenden Sie stattdessen unison:

unison A/ B/

Wenn Sie dies zum ersten Mal ausführen, werden Dateien identifiziert, die eindeutig vorhanden sind A, und solche, die eindeutig vorhanden sind B. Außerdem werden diejenigen markiert, die sich an beiden Stellen befinden, und Sie werden aufgefordert, zu identifizieren, welche überschrieben werden sollen.

Wenn Sie dies das nächste Mal ausführen, werden Änderungen von Anach Bund auch Bnach kopiert A, wobei alle Dateien, die an beiden Stellen geändert wurden, für die manuelle Auflösung markiert werden.

mkdir A B
date > A/date
who > B/who
unison A/ B/
# Lots of output from unison, showing synchronisation

ls A
date    who
ls B
date    who

date > A/date
unison A/ B/
# Lots of output from unison, showing synchronisation

Es gibt eine Reihe nützlicher Flags, mit unisondenen Sie den Prozess automatisieren können, indem Sie Annahmen definieren und dadurch die Anzahl der Fragen reduzieren, die Ihnen während der Synchronisierung gestellt werden.

Roaima
quelle
3
Ich habe eine unisono Lösung gesehen, aber das Problem dabei ist, dass ich auf beiden Seiten installieren muss. Ich synchronisiere mit einer Fernbedienung und kann nicht unisono auf der Fernbedienung installieren.
Raza
1
Es hilft dem OP nicht, aber ich suchte nach Übereinstimmung . Ich sehe, dass es Debian-Pakete gibt und es SSH-Transport unterstützt.
Ted
1
Es gibt Möglichkeiten, Unison zu verwenden, ohne es auf dem Server zu installieren. Siehe die Kommentare in dieser Antwort stackoverflow.com/a/2936711, die auf i3vi3v.wordpress.com/2013/01/09/… verweist
Thomas
-1

Was Sie wirklich brauchen, ist Rclone . Rclone ist rsync für Cloud-Speicher (Box, Dropbox, Nextcloud, FTP usw.) und lokalen Speicher.

user1461607
quelle
2
Wie würden sie rclone installieren und verwenden , um ihr Problem zu lösen?
Jeff Schaller
2
rclone hat noch keine bidirektionale Synchronisierung.
Sean