Wie werden zwei Ordner automatisch synchronisiert?

89

Ich möchte eine synchronisierte Kopie eines Ordners mit seinem gesamten Teilbaum haben.

Dies sollte automatisch so funktionieren: Wenn ich Inhalte aus dem ursprünglichen Ordner erstelle, ändere oder lösche, sollten diese Änderungen automatisch auf den Synchronisierungsordner angewendet werden.

Welches ist der beste Ansatz für diese Aufgabe?

Übrigens: Ich bin auf Ubuntu 12.04

Das endgültige Ziel ist eine separate Echtzeit-Sicherungskopie ohne Verwendung von Symlinks oder Mount. Ich habe Ubuntu One verwendet, um Daten zwischen meinen Computern zu synchronisieren. Nach einer Weile ist ein Fehler aufgetreten und alle meine Daten sind während einer Synchronisierung verloren gegangen.

Daher habe ich mir überlegt, einen weiteren Schritt hinzuzufügen, um eine Sicherungskopie meiner Daten zu erhalten:

  • Ich speichere meine Daten in einem "Ordner A"
  • Ich benötige die Antwort auf meine aktuelle Frage, um eine Einweg-Synchronisierung von "Ordner A" mit "Ordner B" zu erstellen ( cronein Skript mit rsync? Könnte sein?). Ich brauche es nur in eine Richtung von A nach B, Änderungen an B dürfen nicht auf A angewendet werden.
  • Ich halte einfach "Ordner B" mit Ubuntu One synchronisiert.

    Auf diese Weise wird jede Änderung in A auf B übertragen, die von U1 erkannt und mit der Cloud synchronisiert wird. Wenn etwas schief geht und U1 meine Daten auf B löscht, habe ich sie immer auf A.

Inspiriert von den Kommentaren von lanzz könnte eine andere Idee darin bestehen, rsync beim Start auszuführen, um den Inhalt eines Ordners unter Ubuntu One zu sichern, und Ubuntu One erst nach Abschluss von rsync zu starten.

Was denkst du darüber? Woher wissen, wann rsync endet?

Luca Borrione
quelle
Was versuchst du zu erreichen? Müssen die Ordner wirklich getrennt sein, können Sie nicht einen Namen mit dem anderen verknüpfen oder das Verzeichnis an den sekundären Speicherort binden ? Schauen Sie sich auch diese Suchergebnisse an .
Lanzz
1
Ich würde von einer tatsächlichen Live-Synchronisierung (dh kontinuierlicher Suche nach Dateiänderungen im Quellverzeichnis) zugunsten einer periodischen rsyncVia-Cron abraten .
Lanzz

Antworten:

100

Sie können inotifywait(mit modify,create,delete,moveaktivierten Flags) und verwenden rsync.

while inotifywait -r -e modify,create,delete,move /directory; do
    rsync -avz /directory /target
done

Wenn Sie nicht inotifywaitauf Ihrem System haben, führen Siesudo apt-get install inotify-tools

Silgon
quelle
3
Möglicherweise möchten Sie eine Erweiterung hinzufügen -e ssh user@remote:/target, rsyncwenn Sie SSH als Transportmittel für den Zugriff auf Ihren Remotecomputer verwenden möchten.
Falcon
2
Danke @Falcon, ich benutze normalerweise rsync -avz --delete --exclude-from=.rsyncignore /directory user@server:path. Ich wollte jedoch eine einfache Antwort schreiben.
Silgon
5
zur Verdeutlichung: Ist das eine einmalige Sache, oder würden Sie dies einem Bashrc oder so etwas hinzufügen?
Brad Johnson
1
Sie können die gesamte while-Schleife als einen Prozess betrachten, der bei Bedarf synchronisiert wird. Normalerweise füge ich es dem Makefile des Projekts hinzu, an dem ich arbeite. Auf diese Weise kann ich den Server und das Verzeichnis auswählen, in dem er gespeichert werden soll. Einer meiner Anwendungsfälle ist, wenn ich Deep-Learning-Algorithmen in meinem Laptop programmiere und synchronisiere, um den schweren Prozess in einem dedizierten Computer mit besserer CPU und GPU auszuführen. Ich schließe auch Dateien aus, die ich nicht benötige, wie z. B. den .gitOrdner.
Silgon
2
Dies behandelt keine Umbenennung von Dateien, verwenden Siemodify,create,delete,move
urusha
25

Sie benötigen ungefähr Folgendes : https://github.com/axkibe/lsyncd Es ist ein Tool, das rsync und inotify kombiniert. Ersteres ist ein Tool, das mit den richtigen Optionen ein Verzeichnis bis zum letzten Bit spiegelt. Letzteres weist den Kernel an, ein Programm über Änderungen an einem Verzeichnis der Datei zu informieren. Es sagt:

Es aggregiert und kombiniert Ereignisse für einige Sekunden und erzeugt dann einen (oder mehrere) Prozesse, um die Änderungen zu synchronisieren.

Aber - laut Digital Ocean unter https://www.digitalocean.com/community/tutorials/how-to-mirror-local-and-remote-directories-on-a-vps-with-lsyncd - sollte es in sein das Ubuntu-Repository!

Ich habe ähnliche Anforderungen, und dieses Tool, das ich noch nicht ausprobiert habe, scheint für diese Aufgabe geeignet zu sein.

Martin
quelle
1
lsyncd schien zunächst wie eine Silberkugel, hat aber viele offene Probleme und anscheinend ist die macOS-Implementierung "alt und veraltet". Ich konnte es am 10.12 nicht zum Laufen bringen.
Ein bezahlter Nerd
@apaidnerd Um fair zu sein, es sind 90 Ausgaben offen gegen 420 geschlossen. Im letzten Jahr wurden jedoch nur 10/40 Ausgaben geschlossen.
Mateen Ulhaq
8

Nur einfache Änderung von @silgon Antwort:

while true; do 
  inotifywait -r -e modify,create,delete /directory
  rsync -avz /directory /target
done

(@ silgon Version stürzt manchmal unter Ubuntu 16 ab, wenn Sie es in cron ausführen)

Denis Kuzin
quelle
2
Warum würden Sie es in cron laufen lassen?
Saygley
@saygley Für eine bestimmte Aufgabe sollte nach dem Neustart von Ubuntu der Synchronisierungsprozess automatisch ausgeführt werden
Denis Kuzin
5
Ich verstehe .. Trotzdem, da dies normalerweise einmal gestartet werden sollte und laufen sollte, solange der Server aktiv ist; Ich würde stattdessen etwas in rc.local Inline betrachten.
Saygley
2

Sie können fschange nutzen . Es handelt sich um eine Benachrichtigung über Änderungen am Linux-Dateisystem. Der Quellcode kann über den obigen Link heruntergeladen werden. Sie können ihn selbst kompilieren. fschangekann verwendet werden, um Dateiänderungen zu verfolgen, indem Daten aus einer Proc-Datei (/ proc / fschange) gelesen werden. Wenn Daten in eine Datei geschrieben werden, gibt fschange das genaue Intervall an, das geändert wurde, anstatt nur zu sagen, dass die Datei geändert wurde. Wenn Sie nach einer fortschrittlicheren Lösung suchen, würde ich empfehlen, Resilio Connect zu überprüfen . Es ist plattformübergreifend und bietet erweiterte Optionen für die Verwendung und Überwachung. Da es BitTorrent-basiert ist, ist es schneller als jedes andere vorhandene Synchronisierungstool. Es wurde in ihrem Namen geschrieben.


quelle
0

Ich verwende dieses kostenlose Programm, um lokale Dateien und Verzeichnisse zu synchronisieren: https://github.com/Fitus/Zaloha.sh . Das Repository enthält auch eine einfache Demo.

Der gute Punkt: Es ist ein Bash-Shell-Skript (nur eine Datei). Keine Black Box wie andere Programme. Dokumentation ist auch da. Mit einigen technischen Talenten können Sie es auch "biegen" und "integrieren", um die endgültige Lösung zu erstellen, die Sie mögen.

Petas
quelle