Wie bringe ich rsync dazu, Dateien zu löschen, die aus dem Quellordner gelöscht wurden?

Wie bringe ich rsync dazu, Dateien zu löschen, die aus dem Quellordner gelöscht wurden?

Ich habe vor Kurzem eine Maschine mit Ubuntu Server eingerichtet, um Spieleserver zu hosten. Ich habe für jeden Spieleserver ein Backup-Plugin installiert, das regelmäßig Backups der Spielweltdateien in einem bestimmten Ordner auf der Maschine erstellt. Ich habe auch eine cronAufgabe eingerichtet, um diese Backups jede Nacht automatisch mit rsync und der -aOption in meinen Dropbox-Ordner zu kopieren.

Nach ein paar Monaten erreichte mein Dropbox-Konto sein Speicherlimit und mir wurde klar, dass ich nicht so viele Backups behalten konnte. Also konfigurierte ich das Backup-Plugin des Spielservers so, dass es nicht so viele Backups behält. Dann wartete ich ein paar Tage, um zu sehen, ob es die älteren Backups löschen würde, wie es wöchentlich geplant ist. Das Backup-Plugin erledigte schließlich seine Aufgabe und löschte die älteren Backups. Ich erwartete also, dass die rsyncCron-Aufgabe anschließend die älteren Backups aus meinem Dropbox-Ordner löscht, um sie mit dem Quellordner abzugleichen, aber das tat sie nicht. Daher habe ich ein paar Fragen:

  • Standardmäßig funktioniert rsyncnurhinzufügenDateien in den Zielordner, die dem Quellordner hinzugefügt wurden undändernDateien, die im Quellordner geändert wurden, aberNICHT löschenDateien, die aus dem Quellordner gelöscht wurden?

  • Wenn das der Fall ist, wie kann ich rsyncdas am besten erreichen? Ich möchte, dass der Zielordner den Quellordner genau widerspiegelt, und das bedeutet, dass alle Dateien gelöscht werden, die aus dem Quellordner gelöscht wurden.

Ich sehe auf der Manualpage einige Optionen, rsyncdie möglicherweise funktionieren, bin damit aber nicht vertraut.

Antwort1

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

rsync -avh source/ dest/ --delete

NB: -avhist für--archive --verbose --human-readable

Antwort2

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

Ich empfehle Ihnen, rsynczur Sicherung der Quelldateien und find ... rmzum Löschen von Dateien für einen bestimmten Zeitraum oder eine bestimmte Dateigröße Folgendes zu verwenden:

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

Erstellen Sie mit dem obigen Codeblock eine Sicherungskopie der Quelle und löschen Sie anschließend alle Dateien, deren letzte Änderung länger als zwei Monate zurückliegt.

AKTUALISIEREN

Ich finde, dass die deleteOptionen nur für TARGET gelten, wenn einige Dateien aus der Quelle entfernt werden, rsync --deletediese auch aus TARGET entfernt werden. Und die deleteOption von afterund before, wie in der Manpage erwähnt:

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

Bedeutet, dass:

  1. rsync löscht die Dateien aus dem ZIEL, die aus der QUELLE entfernt wurden.
  2. rsync beginnt mit der Synchronisierung der Dateien.
--delete-after          receiver deletes after transfer, not during

Bedeutet, dass:

  1. rsync beginnt mit der Synchronisierung der Dateien.
  2. rsync löscht die Dateien aus dem ZIEL, die nach der Synchronisierung aus der QUELLE entfernt wurden.

NOTIZ: Das --delete-{before/after}Gerät ist gerade im ZIEL.

Antwort3

Der Befehl

$ rsync -avhn --delete local/ remote/

sorgt dafür, dass Änderungen, die lokal vorgenommen wurden, immer auf die Remote-Seite zurücksynchronisiert werden. Das heißt, es sorgt dafür, dass Änderungen synchronisiert werdenlokalUndFernbedienungso dass

  1. DateienhinzugefügtInlokalwerden hinzugefügtFernbedienung
  2. DateienENTFERNTauslokalwerden entfernt vonFernbedienung
  3. DateienhinzugefügtInFernbedienungwerden entfernt
  4. DateienENTFERNTausFernbedienungwerden wiederhergestellt vonlokalwenn sie existieren, sonst ignoriert

Die Parameter erklärt:

  • -aArchivmodus
  • -vAusführlichkeit erhöhen
  • -hZahlen in einem für Menschen lesbaren Format ausgeben
  • -nTrockenlauf: Führen Sie einen Probelauf durch, ohne Änderungen vorzunehmen.Verwenden Sie dieses Flag immer zuerst, um Datenverlust zu verhindern. Wenn Sie zufrieden sind, entfernen Sie es.

Lassen wir die Ergebnisse für sich sprechen:

  • Erstellen Sie 2 Verzeichnisse

    $ mkdir local/ remote/
    
  • Erstellen Sie darin Dateien

    $ touch local/local_only remote/remote_only local/exists_locally_and_remotely remote/exists_locally_and_remotely`
    
  • Sehen Sie, was erstellt wurde (vor rsync):

    $ ls local/ remote/ 
    
    local/:
    exists_locally_and_remotely  local_only
    
    remote/:
    exists_locally_and_remotely  remote_only
    
  • rsync aufrufen:

    $ rsync -avh --delete local/ remote/
    sending incremental file list
    deleting remote_only
    local_only
    
    sent 160 bytes  received 50 bytes  420.00 bytes/sec
    total size is 0  speedup is 0.00
    
  • Sehen Sie sich das Ergebnis an (nach rsync):

    $ ls local/ remote/ 
    
    local/:
    exists_locally_and_remotely  local_only
    
    remote/:
    exists_locally_and_remotely  local_only
    

Wie Sie sehen können, die Dateiremote/nur remoteist gewesengelöscht, die Dateilokal/nur lokalist gewesensynchronisiert.

Antwort4

Wenn während einer Rsync-Synchronisierung Fehler auftreten, löscht Rsync die gewünschten Dateien nicht ordnungsgemäß, selbst wenn Sie --delete, --delete-after, oder verwendet haben --delete-before.

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

Die meisten meiner Fehler waren auf die Verwendung der --permsOption beim Synchronisieren mit einem Nicht-Linux-Dateisystem zurückzuführen. Als ich --permsdurch ersetzte --no-perms, verschwanden diese Fehler und das Löschen funktionierte anschließend.

--permsist in Ordnung, wenn Sie von einem Linux-Dateisystem zu einem anderen Linux-Dateisystem synchronisieren, aber wenn Sie von Linux zu einem Nicht-Linux-Dateisystem (wie NTFS, FAT) synchronisieren, --permsverursacht dies Fehler, weilrsync kann keine Linux-Berechtigungen auf Nicht-Linux-Dateisystemen festlegen. Auch hier gilt: Fehler = kein Löschen.

-- Beim Synchronisieren mit einer Nicht-Linux-Partition verwende ich, --no-permsum Fehler zu vermeiden, die --delete, --delete-after, oder sabotieren --delete-before.

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

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

Der obige Befehl löscht nicht synchronisierte Dateien, synchronisiert aber keine. Sie sollten also danach erneut synchronisieren. Dieser Befehl basiert auf diesemAntwort, außer dass ich auch das --ignore-errorsArgument hinzugefügt habe, sodass es auch gelöscht wird, wenn Fehler vorliegen.

verwandte Informationen