2010-06-25 12:29:20 +0000 2010-06-25 12:29:20 +0000
126
126

Was sind die Unterschiede zwischen den rsync-Löschoptionen?

Ich sehe auf der rsync man page , dass es eine Reihe von delete Optionen gibt, verstehe aber nicht wirklich die Unterschiede zwischen ihnen. Was sind die Unterschiede zwischen diesen Optionen?

--del an alias for --delete-during
 --delete delete extraneous files from dest dirs
 --delete-before receiver deletes before transfer (default)
 --delete-during receiver deletes during xfer, not before
 --delete-delay find deletions during, delete after
 --delete-after receiver deletes after transfer, not before
 --delete-excluded also delete excluded files from dest dirs

Antworten (4)

125
125
125
2010-06-25 14:19:55 +0000
  • --del/--delete_during: Löscht Dateien beim Kopieren aus dem Zielverzeichnis (spart Speicher im Vergleich zu --delete-before: --delete-before führt einen separaten Scan durch, um nach löschbaren Dateien zu suchen)

  • --delete: Löscht Dateien im Zielverzeichnis, wenn sie im Quellverzeichnis nicht vorhanden sind.

  • --delete-before: Löschen von Dateien im Zielverzeichnis vor dem Kopieren von Datei-mit-gleichem-Namen aus dem Quellverzeichnis

  • --delete-during: Löschen von Dateien im Zielverzeichnis WÄHREND des Kopierens von Datei-mit-gleichem-Namen aus dem Quellverzeichnis

  • --delete-delay: Markieren löscht während der Übertragung, aber warten, bis die Übertragung abgeschlossen ist

  • --delete-after: Empfänger löscht nach der Übertragung, nicht vorher… Wenn ein anderer Teil des rsync zusätzliche Dateien an einen anderen Ort verschoben hat, würden Sie dies anstelle von --delete-delay wollen, weil --delete-delay mitten in der Übertragung entscheidet, was gelöscht werden soll, während --delete-after das Verzeichnis auf Dateien überprüft, die gelöscht werden sollen, NACHDEM alles fertig ist.

  • --delete-excluded: Löscht Dateien aus dem Zielverzeichnis, die explizit von der Übertragung aus dem Quellverzeichnis ausgeschlossen sind.

Der Sinn von rsync ist nicht das Kopieren, sondern das Archivieren. Dies ist eine wichtige Unterscheidung. Die Verarbeitung von gelöschten/geänderten Dateien ist kritisch und in vielen Fällen nuanciert.

Insbesondere das Flag --delete ist eines, das ich schon oft vermasselt gesehen habe. Viele Leute benutzen rsync, um Dateien in einen Speicher mit niedriger Priorität zu verschieben, und in diesem Fall wollen Sie, dass die Dateien, die Sie verschieben, im Zielverzeichnis noch EXISTIEREN. Das ist nicht das, was delete tut: --delete stellt sicher, daß, wenn Sie eine Datei aus dem Quellverzeichnis löschen, sie auch aus dem Zielverzeichnis gelöscht wird, so daß Ihr Ziel nicht mit Müll vollgestopft wird… Ich habe mal gesehen, wie ein Typ sein Backup gelöscht hat, indem er ein neues Laufwerk einbaute und sein nächtliches rsync-Skript nicht abschaltete. Das Skript sah, dass das Quellverzeichnis nun leer war, und löschte jede Datei im Zielverzeichnis, damit sie übereinstimmen würden.

Die meisten der anderen Optionen sind platz- oder leistungsbezogen. Wann Sie die Dateien löschen, ist wichtig, wenn Sie sicherstellen wollen, dass die Übertragung erfolgreich ist, bevor Sie irgendetwas tun, aber wenn Ihr Gerät zu klein ist, um 2 Kopien aller Informationen zu handhaben, müssen Sie nach und nach löschen, usw. Es ist ein wenig verrückt wegen seiner langen Geschichte über mehrere Plattformen hinweg: einige Optionen wurden hinzugefügt, damit Leute, die an ein bestimmtes Verhalten gewöhnt waren, nicht verwirrt werden.

2
2
2
2013-01-17 18:50:20 +0000

Ein weiterer erwähnenswerter Punkt ist, dass, wenn Ihr Quellverzeichnis mit /* endet, rsync nur diese Dateien berücksichtigt und nicht das Verzeichnis selbst (und damit das Fehlen von Dateien, die Sie auf dem Ziel löschen wollen).

Wenn Sie oben eine Löschoption angeben, aber rsync sieht so aus, als würde es nicht löschen, dann überprüfen Sie, ob Sie nicht versehentlich globieren und eine Liste von Dateien angeben, wenn Sie das Verzeichnis selbst meinen.

2
2
2
2010-06-25 12:57:07 +0000

Es gibt zwei Dinge, die vor sich gehen:

  1. Wer das Löschen vornimmt
  2. Wann es passiert

Entweder der Sender oder der Empfänger kann angewiesen werden, das Löschen durchzuführen (ich bin mir nicht sicher, warum das wichtig ist). Wenn also rsync von einem Computer eine Verbindung zum rsync-Server auf der anderen Seite herstellt, bestimmt dies, wer effektiv den Löschbefehl ausgibt.

Wann es passiert, ist ziemlich einfach… vorher bedeutet, dass alle Dateien gelöscht werden, und DANN kopiert rsync die Dateien rüber. während bedeutet, dass es durch die Liste der Dateien geht und sie löscht, wenn es zu ihnen kommt, und nachher bedeutet, dass es wartet, bis alle Dateien rüber übertragen sind und dann die entfernte Seite löscht. Dies ist nur von Bedeutung, wenn die Übertragung unterbrochen wird.

0
0
0
2019-12-31 14:32:28 +0000

Standardmäßig löscht rsync keine Dateien auf der Zielseite. Damit rsync überhaupt Dateien löscht, müssen Sie mindestens eine der Löschoptionen verwenden.

Wenn es Ihnen egal ist, wann Dateien gelöscht werden, verwenden Sie einfach --delete und überlassen Sie die Auswahl rsync. Sie können --delete mit anderen Löschoptionen kombinieren (dies führt nicht zu Konflikten), müssen es aber nicht, da alle anderen Löschoptionen bereits --delete implizieren.

--delete-before funktioniert wie folgt: rsync schaut, welche Dateien in der Quelle und welche im Ziel vorhanden sind, löscht alle Dateien, die im Ziel, aber nicht in der Quelle gefunden werden und startet dann die eigentliche Synchronisation. Diese Reihenfolge ist nützlich, wenn das Ziel wenig Speicherplatz hat, da es zuerst mehr Speicherplatz am Ziel freigibt, bevor es mit der Übertragung neuer Dateien beginnt. Der Nachteil ist, dass rsync mehr Speicher für die Durchführung des Vorgangs benötigt und der gesamte Vorgang in zwei Schritten abläuft und somit langsamer ist.

--delete-during funktioniert wie folgt: rsync beginnt sofort mit dem Synchronisieren von Dateien und wenn es auf eine Datei stößt, die nur am Zielort existiert, wird diese gelöscht. Auf diese Weise gibt es keine Geschwindigkeitseinbußen und es wird auch kein zusätzlicher Speicher benötigt. Der Nachteil ist, dass es passieren kann, dass zuerst viele neue Dateien in die Ziele kopiert werden, bevor entfernte Dateien gelöscht werden, so dass das Ziel während des Vorgangs viel mehr Speicherplatz benötigt, als es am Ende benötigt, wenn der gesamte Vorgang abgeschlossen ist.

--delete-after funktioniert wie folgt: Zuerst werden alle Dateien synchronisiert, dann wird die gleiche Operation durchgeführt, die --delete-before vor der Synchronisierungsphase durchführt. Dies ist in den meisten Fällen die schlechteste Wahl, da sie den meisten Speicher benötigt, den meisten Speicherplatz am Zielort und sie ist langsamer, da es sich um einen zweistufigen Prozess handelt; im Grunde kombiniert sie alle Nachteile der anderen beiden Methoden. Diese Option existiert hauptsächlich für den Fall, dass Sie “Zusammenführungsdateien” verwenden (was Zusammenführungsdateien sind und wie sie funktionieren, geht über den Rahmen dieser Antwort hinaus). Da diese Dateien Regeln für Dateien enthalten können, die beim Löschen ausgeschlossen werden sollen, müssen neue Zusammenführungsdateien vor der Löschphase kopiert werden, wenn ihr Inhalt während der Löschphase berücksichtigt werden soll. Wenn das keine Anforderung ist, hat --delete-after keinen Vorteil.

--delete-delay ist eine ziemlich neue Option (sie ist in rsync 2.6.9 nicht verfügbar, was z. B. in macOS 10.15 noch der Standard ist). Sie funktioniert wie --delete-during, nur dass sie Dateien nicht sofort löscht, sondern erst nach der Synchronisation, ist also eine Mischung aus --delete-during und --delete-after. Der Vorteil ist, dass es schneller ist als --delete-after, der Nachteil ist, dass es mehr Speicher während der Synchronisation benötigt.

--delete-excluded weist rsync an, nicht nur Dateien zu löschen, die in der Quelle fehlen, sondern auch Dateien am Ziel zu löschen, die von der Synchronisation ausgeschlossen wurden (--exclude oder --exclude-from), unabhängig davon, ob diese Dateien in der Quelle tatsächlich existieren würden oder nicht.