Wie lösche ich mit rsync Dateien, die aus dem Quellordner gelöscht wurden?


197

Ich habe kürzlich einen Computer mit Ubuntu Server eingerichtet, auf dem Spieleserver gehostet werden. Ich habe für jeden Spieleserver ein Backup-Plugin installiert, das regelmäßig Backups von Spieledateien in einem bestimmten Ordner auf dem Computer erstellt. Ich habe auch eine cronAufgabe eingerichtet, um diese Sicherungen mit rsync und der -aOption jede Nacht automatisch in meinen Dropbox-Ordner zu kopieren .

Nach ein paar Monaten hatte mein Dropbox-Konto sein Speicherlimit erreicht und ich stellte fest, dass ich nicht mehr so ​​viele Backups speichern konnte. Deshalb habe ich das Backup-Plugin für den Spieleserver so konfiguriert, dass nicht mehr so ​​viele Backups gespeichert werden Löschen Sie die älteren Backups wie geplant wöchentlich. Das Backup-Plugin hat schließlich seine Aufgabe erledigt und die älteren Backups gelöscht. Ich hatte erwartet, dass der rsyncCron-Task anschließend die älteren Backups aus meinem Dropbox-Ordner löscht, um sie mit dem Quellordner abzugleichen. Dies ist jedoch nicht der Fall. Ich habe also ein paar Fragen:

  • Standardmäßig wird rsyncnur hinzufügen , Dateien in den Zielordner, in den Quellordner hinzugefügt wurden und ändern Dateien , die im Quellordner geändert wurden , aber nicht löschen Dateien , die aus dem Quellordner gelöscht wurden?

  • Wenn dies der Fall ist, wie kann man dies am besten erreichen rsync? Ich möchte, dass der Zielordner den Quellordner perfekt widerspiegelt. Das bedeutet, dass alle Dateien gelöscht werden, die aus dem Quellordner gelöscht wurden.

Ich sehe einige Optionen, die in der Handbuchseite aufgeführt sind rsync, um den Trick zu machen, aber da ich nicht mit vertraut bin.

Antworten:


230

Fügen Sie --deleteIhrem Befehl die Option hinzu, um Dateien im Ziel zu löschen . Zum Beispiel:

rsync -avh source/ dest/ --delete

15
Stellen Sie sicher, dass die Quelle ein Verzeichnis ist. Verwenden source/* dest/wird nicht funktionieren.
Tom Saleeba

3
Ich habe das Ereignis mit gefunden --deleteoder --delete-afteres wird aufgrund einiger Fehler nicht gelöscht: "Es ist ein E / A-Fehler aufgetreten - Löschen der Datei wird übersprungen". Um diese Add- --ignore-errorsOption zu beheben und die Fehler separat zu debuggen
MHT

12
Funktioniert perfekt! Auch wenn es funktioniert, würde ich empfehlen, die -n, --dry-runOption IMMER zu verwenden , bevor Sie ausgeführt werden. rsyncDies gilt insbesondere für Optionen wie diese ( --delete). Es werden mögliche Kopfschmerzen vermieden :).
Iwanleoncz

2
@ MHT: Keine Antwort scheint ohne Ihren Kommentar vollständig zu sein.
Lonnie Best

2
@TheBicentennialMan -a impliziert -r .
X-Yuri

46

Der Befehl rsync löscht keine Datei, während Sie einige seiner Optionen deletein diesem Befehl verwenden. Wenn also Dateien oder Ordner in der Quelle hinzugefügt werden, werden sie ohne Löschung mit dem Ziel synchronisiert.

Ich empfehle Ihnen, rsynceine Sicherungskopie von Quelldateien zu erstellen und find ... rmDateien für einen bestimmten Zeitraum oder eine bestimmte Dateigröße zu löschen:

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

Erstellen Sie im obigen Codeblock eine Sicherungskopie vom Quellcode und löschen Sie anschließend alle Dateien, deren letzte Änderungszeit mehr als 2 Monate beträgt.

AKTUALISIEREN

Da ich finde, dass die deleteOptionen nur für TARGET gelten, rsync --deleteentfernen Sie einige Dateien aus TARGET, wenn sie aus dem Quellcode entfernt wurden. Und die deleteOption von afterund before, wie in seiner Manpage erwähnt:

--delete-before         receiver deletes before transfer, not during

Bedeutet, dass:

  1. rsync löscht die Datei aus TARGET, die aus SOURCE entfernt wurden.
  2. rsync startet die Synchronisation der Dateien.

--delete-after receiver deletes after transfer, not during

Bedeutet, dass:

  1. rsync startet die Synchronisation der Dateien.
  2. rsync löscht die Datei aus TARGET, die nach der Synchronisation aus SOURCE entfernt werden.

HINWEIS : das --delete-{before/after}Gerät nur in TARGET.


1
Danke für die Antwort!! Beziehen Sie sich auf eine Löschoption für rsync? Warum kann ich nicht einfach die Option "Löschen" für rsync verwenden?
user254251

@ user254251, Wenn Sie delete verwenden, werden mit dem Befehl rsync sofort Dateien gelöscht. In diesem Fall bleibt jedoch mehr Zeit für Fehler.
ShgnInc

Wenn ich das richtig verstehe, sollten Sie die Löschaufgabe von der rsync-Aufgabe trennen, um Fehler zu vermeiden. Ich habe jedoch eine Frage. In der Handbuchseite für rsync sind einige Optionen aufgeführt, die dem Zweck zu dienen scheinen, die Löschaufgabe zu trennen, indem sie vor oder nach der Kopieraufgabe ausgeführt wird. Zum Beispiel sehe ich zwei Optionen --delete-before und --delete-after. Würde rsync mit diesen Optionen den gleichen Effekt haben wie die von Ihnen beschriebene Methode? Ich habe die vollständige Beschreibung der einzelnen Optionen auf der Handbuchseite gelesen, aber die Beschreibungen enthalten einige Informationen, die ich nicht verstehe.
user254251

@ user254251, Antwort wurde aktualisiert. Ich weiß nicht, ob es in rsync eine Möglichkeit gibt, Dateien zeitlich begrenzt aus TARGET zu löschen .
ShgnInc

Vielen Dank! Glauben Sie also, ich bin vor Fehlern sicher, wenn ich einfach die Option --delete-before verwende? Ich gebe keine Zeitüberschreitung an, daher sollte ich mir keine Sorgen machen müssen, wenn die rsync-Löschphase die Übertragungsphase verzögert. rsync wird einmal pro Tag ausgeführt, und das ist ausreichend Zeit, um die Sicherungsdateien vor der nächsten Synchronisierung zu synchronisieren. Daher sollte es auch nicht erforderlich sein, die Synchronisierung zeitlich zu begrenzen.
user254251

6

Mit diesem Befehl werden inkrementelle Daten kopiert und mit dem Remote-Server synchronisiert.

  1. Es werden nur inkrementelle Daten kopiert.
  2. Es werden alle Daten gelöscht, die aus der Quelle gelöscht wurden.
  3. Es wird erneut von der Quelle kopiert, wenn Daten am Ziel gelöscht wurden.
  4. Im Grunde wird dieser Befehl die beiden Umgebungen synchron halten.

rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)

Beispiel:

rsync -avWe ssh --delete-before /data root@192.168.254.254:/backup
rsync -avW --delete-before -e ssh /data root@192.168.254.254:/backup

2
Ich denke -W macht es nicht, nur inkrementelle Daten zu kopieren, sondern immer ganze Dateien zu kopieren.
Tulains Córdova

Ich habe diesen Fehler durch Ausführen dieses Befehls erhalten: rsync: Failed to exec --delete-before: No such file or directory (2)
Jeff Tian

1

Wenn es irgendwelche Fehler während eines rsync scync sind, rsync nicht richtig die Dateien löschen sollte, auch wenn Sie verwendet --delete, --delete-afteroder --delete-before.

Aus diesem Grund ist es wichtig, rsync-Fehler zu beheben.

Die meisten meiner Fehler waren auf die Verwendung der --permsOption während der Synchronisation mit einem Nicht-Linux-Dateisystem zurückzuführen. Als ich ersetzt --permsmit --no-perms, gingen diese Fehler weg und arbeitete dann zu löschen.

--permsist in Ordnung, wenn Sie von einem Linux-Dateisystem zu einem anderen Linux-Dateisystem synchronisieren. Wenn Sie jedoch von Linux zu einem Nicht-Linux-Dateisystem synchronisieren (z. B. NTFS, FAT), --permsführt dies zu Fehlern, da rsync keine Linux-Berechtigungen für a festlegen kann Nicht-Linux-Dateisysteme . Wieder Fehler = kein Löschen.

- Wenn die Synchronisierung zu einer Nicht-Linux - Partition, benutze ich , --no-permsum diese Fehler zu vermeiden , die Sabotage --delete, --delete-afteroder --delete-before.

Wenn danach immer noch Fehler auftreten und Sie nicht herausfinden können, wie diese Fehler behoben werden können, können Sie einen Befehl ausführen, der ausschließlich zum Löschen der nicht synchronisierten Dateien bestimmt ist:

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

Der obige Befehl löscht nicht synchronisierte Inhalte, synchronisiert jedoch keine Dateien. Also sollten Sie danach erneut synchronisieren. Dieser Befehl basiert auf dieser Antwort , mit der Ausnahme, dass ich das --ignore-errorsArgument ebenfalls hinzugefügt habe , sodass es gelöscht wird, selbst wenn Fehler vorliegen.


1
Danke für den Tipp! Ich bin der ursprüngliche Autor dieser Frage vor 5 Jahren. Ich bin wirklich froh, dass Sie dies gepostet haben, da ich geplant habe, in naher Zukunft die Synchronisierung mit einem NTFS-Laufwerk einzurichten, und ich wahrscheinlich auf den Berechtigungsfehler gestoßen wäre, weil ich die Option "-a" für verwenden wollte rsync, das unter anderem Berechtigungen synchronisiert. Also habe ich meinen Notizen "--no-perms" hinzugefügt. Ich plane jetzt, rsync -a --no-perms --delete-before zu verwenden. Ich habe eine Frage: Würde --delete-before nicht Probleme beim Löschen von Dateien vermeiden, indem Sie den Löschvorgang vor der Synchronisierung ausführen? Dachte, das war sein Zweck.
user254251

@ user254251 - Ich bin nicht sicher. Ich denke, es würde davon abhängen, wie früh es wirklich "vor" löscht. Wenn es einigermaßen darum geht, auf einen Fehler zu stoßen, bevor der Löschvorgang beginnt, schraubt Ihr. Mein Rat an Sie ist, NTFS zu vermeiden, wann immer Sie können, es sei denn, Sie mögen scharfe Schmerzen in Ihrem Arsch :). NTFS zu NTFS funktioniert gut. NTFS zu Linix funktioniert gut. Vermeiden Sie "Linux-Dateisystem" zu "Nicht-Linux-Dateisystem"; Es ist zu schmerzhaft, um sicherzustellen, dass das Löschen richtig funktioniert. Sie KÖNNEN dies tun, aber ich entschied, dass es sich nicht lohnt, das Ziellaufwerk als EXT4 zu formatieren.
Lonnie Best
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.