Bitten Sie rsync, Dateien auf der empfangenden Seite zu löschen, die auf der sendenden Seite nicht vorhanden sind, mit Ausnahme der empfangenden Seite

29

Ich habe diese Threads gelesen:

Aber soweit ich das beurteilen kann (vielleicht fehlt mir etwas), decken sie nicht die folgende Frage ab:

Wie können Sie rsyncDateien kopieren und diejenigen auf der empfangenden Seite löschen, die auf der sendenden Seite mit Ausnahmen nicht vorhanden sind? (Entfernen Sie z. B. kein Quecksilber-Repository .hgauf der Empfängerseite, auch wenn auf der Senderseite kein Repository vorhanden ist.)

Eine Möglichkeit?

Entlehnt von der Antwort von @Richard Holloway unten. Angenommen, ich habe die folgende Zeile:

rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path

Soweit ich rsyncweiß , würde in dieser Zeile alles auf dem Empfangspfad gelöscht, was auf dem Sendepfad nicht vorhanden ist, mit Ausnahme derjenigen, die mit übereinstimmen dont_delete_me. Meine Frage ist jetzt: Würde rsync Dateien auf der empfangenden Seite behalten, die mit übereinstimmen, dont_delete_me selbst wenn nichts auf der sendenden Seite übereinstimmt dont_delete_me?

Amelio Vazquez-Reina
quelle

Antworten:

33

Wenn Sie --deleteund verwenden, wird das, --excludewas sich am ausgeschlossenen Speicherort befindet, nicht gelöscht, selbst wenn die Quelldateien entfernt werden.

Das wirft jedoch das Problem auf, dass der Ordner überhaupt nicht vorhanden ist rsync. Sie benötigen also einen anderen rsyncJob für syncdiesen Ordner.

Z.B.

rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh

Sie könnten diese anders herum ausführen, aber dann werden alle entfernten Dateien gelöscht und dann ersetzt, was nicht so effizient ist.

Sie können es nicht als Einzeiler tun.

Richard Holloway
quelle
Danke @Richard. Ihre Antwort lässt mich denken, dass meine ursprüngliche Frage einfacher gewesen sein könnte, als ich dachte. Wenn ich die einzelne Zeile verwende: rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/pathWürde das nicht dazu führen, dass rsyncalles auf dem Empfangspfad gelöscht wird, was auf dem Sendepfad nicht vorhanden ist, mit Ausnahme von Dingen, die mit übereinstimmen dont_delete_me? Wäre es am wichtigsten, rsyncdie Dinge auf der empfangenden Seite auf dem gleichen Stand zu halten, dont_delete_me selbst wenn nichts auf der sendenden Seite übereinstimmtdont_delete_me ? Wenn das der Fall ist, denke ich, ist das die einzige Leitung, die ich brauche, oder?
Amelio Vazquez-Reina
Sie sind korrekt, aber Sie werden auch keine neuen Dateien und Änderungen am Ordner dont_delete_me erhalten, wenn Sie dies in einer Zeile tun. Wenn Sie Änderungen und Ergänzungen nicht synchronisieren möchten, können Sie einfach das hier beschriebene Flag --exclude verwenden.
Richard Holloway
@AmV Ausgeschlossene Dateien werden von nicht gelöscht --delete, es sei denn, Sie geben dies ausdrücklich an --delete-excluded. Siehe die Beschreibung von --deleteund --delete-excludedim rsync-Handbuch.
Gilles 'SO - hör auf böse zu sein'
4

Ich fand, dass die folgende Lösung für meine Zwecke funktioniert:

rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest

(Hinweis: Fügen Sie die -nOption zum Trockenlauf hinzu und ändern Sie sie nicht --deletein --delete-excluded!)

Das Ausführen des Befehls führt zu folgenden Eigenschaften:

  • Das Quellverzeichnis srcbleibt unverändert
  • Der destZielordner stimmt mit dem Quellordner überein, außer dass:

    • Elemente in der do_not_send_to_destListe werden nicht an das Ziel gesendet
    • Elemente in der do_not_modify_in_destListe bleiben im Ziel unverändert.
  • (Hinweis: Es ist kein Problem, wenn nicht vorhandene Elemente in einer der " do_not_" Dateien aufgelistet werden.)

Erläuterung

Ich vermute, während rsync die Befehlszeilenargumente von links nach rechts liest, --deletescheint das Argument dazu zu führen, dass rsync intern den Modus wechselt (in gewissem Sinne), wodurch die zweite Verwendung der --exclude-fromOption wieder möglich wird, jedoch mit einer anderen Bedeutung.

Vorbehalt:

  • Wenn ein Element in der do_not_send_to_destListe bereits im Ziel vorhanden ist, gilt Folgendes:

    • Dieser Befehl entfernt dieses Element nicht vom Ziel (es sei denn, das Element wird zuerst aus dem Quellverzeichnis entfernt).
    • Achtung: Wenn Sie --deleteauf ändern , --delete-excludedwerden alle Einträge im Ziel gelöscht, die in einer Ihrer beiden Listen aufgeführt sind. xD (Vielleicht wurde rsync so geschrieben, dass es offen / flexibel ist, aber einige mit Nuancen?)

Leicht gebrauchsgeprüft.

Ich benutze " rsync version 3.0.9 protocol version 30".

user2533809
quelle