Frage Wie mache ich rsync Dateien löschen, die aus dem Quellordner gelöscht wurden?


Ich habe kürzlich einen Rechner mit Ubuntu Server als Host für Spieleserver eingerichtet. Ich habe ein Backup-Plugin für jeden Gameserver installiert, das häufige Backups von Spielweltdateien in einem bestimmten Ordner auf dem Computer erstellt. Ich habe auch ein cron Aufgabe, diese Backups jeden Abend automatisch in meinen Dropbox - Ordner zu kopieren -a Möglichkeit.

Nach ein paar Monaten erreichte mein Dropbox-Konto sein Speicherlimit und ich erkannte, dass ich nicht in der Lage sein würde, so viele Backups zu speichern. Daher konfigurierte ich das Backup-Plugin für den Spielserver, um nicht so viele Backups zu behalten, und wartete ein paar Tage ab Löschen Sie die älteren Backups wie geplant wöchentlich. Das Backup - Plugin hat schließlich seinen Job erledigt und die älteren Backups gelöscht, so dass ich das erwartet habe rsync cron-Task, um die älteren Backups später aus meinem Dropbox-Ordner zu löschen, damit sie dem Quellordner entsprechen, aber noch nicht. Ich habe also ein paar Fragen:

  • Standardmäßig rsync nur hinzufügen Dateien in den Zielordner die dem Quellordner hinzugefügt wurden und Veränderung Dateien, die wurden im Quellordner aber geändert NICHT löschen Dateien Das wurde aus dem Quellordner gelöscht?

  • Wenn das der Fall ist, was ist der beste Weg zu machen? rsync mach das? ich Wenn der Zielordner den Quellordner perfekt wiedergeben soll, und das bedeutet Löschen von Dateien, die aus der Quelle gelöscht wurden Mappe.

Ich sehe einige Optionen in der Handbuchseite für rsync das könnte der Trick sein, aber da ich nicht vertraut bin.


128
2018-06-03 03:53


Ursprung




Antworten:


Um Dateien im Ziel zu löschen, fügen Sie die Datei hinzu --delete Option zu Ihrem Befehl. Beispielsweise:

rsync -avh source/ dest/ --delete

146
2017-08-26 07:14



Vielleicht mit -aqr stattdessen wäre auch eine idee :) - TheBicentennialMan
Stellen Sie sicher, dass die Quelle ein Verzeichnis ist. Verwenden source/* dest/ wird nicht funktionieren. - Tom Saleeba
Ich habe dieses Ereignis mit gefunden --delete oder --delete-after Es wird wegen einiger Fehler nicht gelöscht: "IO-Fehler aufgetreten - Dateideletion überspringen". Um das zu beheben, fügen Sie hinzu --ignore-errors Option und debuggen Sie die Fehler separat - MHT
Funktioniert perfekt! Obwohl es funktioniert, würde ich empfehlen, IMMER zu verwenden -n, --dry-run Option vor dem Ausführen rsync, besonders wenn es um Optionen wie diese geht (--delete). Es vermeidet mögliche Kopfschmerzen :). - ivanleoncz
@ MHT: Keine Antwort scheint ohne Ihren Kommentar abgeschlossen zu sein. - Lonnie Best


Das rsync Befehl löscht keine Datei, während Sie einige seiner Optionen verwenden delete in diesem Befehl. Wenn also eine Datei oder ein Ordner in der Quelle hinzugefügt wird, wird sie ohne Löschen synchronisiert.

Ich schlage vor, Sie zu benutzen rsync für Backup von Quelldateien erstellen und verwenden find ... rm Löschen von Dateien für den Zeitraum oder die Größe der Dateien:

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

Der obige Code-Block, machen Sie eine Sicherung von der Quelle und löschen Sie dann alle Dateien, die letzte Änderung Zeit mehr als 2 Monate sind.

AKTUALISIEREN

Wie ich finde, dass die delete Optionen sind nur für TARGET, wenn einige Dateien aus der Quelle entfernt werden, rsync --delete Entferne sie von TARGET. Und das delete Option von after und 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 wird.
  2. rsync startet die Synchronisierung von Dateien.

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

Bedeutet, dass:

  1. rsync startet die Synchronisierung von Dateien.
  2. rsync löscht die Datei aus TARGET, die nach der Synchronisierung aus SOURCE entfernt wird.

HINWEIS: das --delete-{before/after} implementieren Sie nur in TARGET.


32
2018-06-03 04:13



Danke für die Antwort!! Beziehen Sie sich auf eine "delete" -Option für rsync? Warum kann ich nicht einfach die Option "Löschen" für rsync verwenden? - user254251
@ user254251, Wenn Sie delete verwenden, löscht der rsync-Befehl sofort Dateien. Aber in diesem Fall bleibt mehr Zeit für Fehler. - shgnInc
Wenn ich das richtig verstehe, sage ich, dass ich die Löschaufgabe von der rsync-Aufgabe trennen sollte, um Fehler zu vermeiden. Ich habe jedoch eine Frage. Die Manpage für rsync listet einige Optionen auf, die dazu dienen, die Löschaufgabe zu trennen, indem sie vor oder nach der Kopieraufgabe ausgeführt wird. Zum Beispiel sehe ich zwei Optionen namens --delete-before und --delete-after. Würde rsync mit diesen Optionen die gleiche Wirkung haben wie die von Ihnen beschriebene Methode? Ich lese die vollständige Beschreibung jeder Option auf der Handbuchseite, aber es gibt einige Informationen in den Beschreibungen, die ich nicht verstehe. - user254251
@ user254251, Antwort wurde aktualisiert. Ich weiß nicht, ob es eine Möglichkeit gibt, Dateien von TARGET durch zeitliche Begrenzung zu löschen rsync. - shgnInc
Vielen Dank! Denkst du also, dass ich vor Fehlern sicher bin, wenn ich einfach die Option --delete-before verwende? Ich gebe kein Timeout an, deshalb sollte ich mir keine Sorgen machen müssen, wenn die rsync-Löschstufe die Übertragungsphase verzögert. Rsync läuft einmal am Tag und das ist genug Zeit, um die Backup-Dateien vor der nächsten Synchronisierung zu synchronisieren, so dass ich die Synchronisierung auch nicht zeitlich begrenzen sollte. - user254251


Dieser Befehl kopiert Inkrementdaten und hält sie synchron mit dem Remote-Server.

  1. Es werden nur inkrementelle Daten kopiert.
  2. Es wird gelöscht, wenn Daten aus der Quelle gelöscht werden.
  3. Es wird erneut von der Quelle kopiert, wenn Daten am Ziel gelöscht wurden.
  4. Im Grunde wird dieser Befehl beide 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

5
2017-07-29 12:12



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