rsync kann nicht leere Verzeichnisse nicht löschen

10

Beim Synchronisieren meiner Remote-Sicherung wird der Fehler angezeigt rsync cannot delete non-empty directory.

Ich kenne die Ursache: Ich habe einige Dateien ausgeschlossen und wenn rsync versucht, ein Remote-Verzeichnis zu löschen, weil es lokal nicht vorhanden ist, kann es nicht, da es nicht leer ist. Ohne den Ausschluss würde das Verzeichnis geleert.

Ich weiß auch, dass ich das Problem durch die Verwendung von --delete-ausgeschlossen beseitigen könnte, aber das will ich nicht.

Ich möchte das Hochladen bestimmter Dateien überspringen (weil sie für meine Upload-Geschwindigkeit zu groß sind), aber ich möchte die Dateien beibehalten, die ich vor einiger Zeit bereits hochgeladen habe, wenn sie lokal vorhanden sind . Wenn sie lokal nicht vorhanden sind, sollten sie gelöscht werden. --delete-ausgeschlossen würde sie alle auf der Remote-Seite löschen.

Das bedeutet auch, dass ein Verzeichnis, das lokal nicht mehr existiert, auch dann gelöscht werden sollte, wenn es ausgeschlossene Dateien enthält.

Ist es möglich, rsync einzurichten, um dies zu erreichen?

Marlar
quelle

Antworten:

5

Verwenden Sie den pModifikator:

Ein p zeigt an, dass eine Regel verderblich ist, was bedeutet, dass sie in Verzeichnissen, die gelöscht werden, ignoriert wird. Beispielsweise werden die Standardregeln der Option -C, die Dinge wie "CVS" und "* .o" ausschließen, als verderblich markiert und verhindern nicht, dass ein in der Quelle entferntes Verzeichnis am Ziel gelöscht wird.

Zum Beispiel verwende ich die -FOption, die "rsync anweist, nach .rsync-Filterdateien pro Verzeichnis zu suchen, die durch die Hierarchie gestreut wurden, und ihre Regeln verwendet, um die Dateien in der Übertragung zu filtern."

Meine .rsync-filterenthält Zeilen wie diese, um diesen "Kot" herauszufiltern, den Macs hinterlassen:

-p .DS_Store
-p ._*

Wenn Sie excludestatt nur verwenden -, fügen Sie ein Komma hinzu. Beispielsweise :

exclude,p .DS_Store
exclude,p Thumbs.db
mivk
quelle
0

Sie können Modifikatoren für Einschluss- / Ausschlussmuster und Add-S für das von Ihnen verwendete Muster verwenden. Es teilt rsync mit, dass die Ausschlussregel nur für die Sendeseite gilt.

-n: Überprüfe nur, was beim Abstieg gelöscht wird, lösche nicht das Muster: * .sh desc: / home / kg / tmp

Ziel: Sie möchten das Dateiende von .sh bei desc löschen. Wenn Sie dies tun, können Sie jedoch nicht bei desc löschen: rsync -rvz --exclude * .sh --delete -n conkg [email protected]: / home / kg / tmp

sollte sich ändern zu: Bitte fügen Sie -n hinzu, wenn Sie den Test testen: rsync -rvz --exclude-from del.txt -n --delete conkg [email protected]: / home / kg / tmp real delete: rsync -rvz - exclude-from del.txt --delete conkg [email protected]: / home / kg / tmp cat del.txt -s * .sh

oder: rsync -rvz --exclude -s * .sh --delete conkg [email protected]: / home / kg / tmp

kg deng
quelle
-2

Verwenden Sie einfach die Optionen '--max-size = xx' und '--delete' von rsync. Es erledigt alles automatisch und erfüllt alle Ihre Anforderungen.

Sparkie
quelle
Es wäre höchstens eine Problemumgehung. Ich möchte mov-, avi- und cr2-Dateien komplett überspringen, da sie im Allgemeinen sehr groß sind. Aber diejenigen, die ich vor einiger Zeit bereits in einer schnelleren Zeile hochgeladen habe, sollten beibehalten werden. Das Problem ist nun, dass die größten JPG-Dateien größer sind als die kleinsten CR2-Dateien, sodass diese Lösung nicht ideal ist. Ich würde lieber die Ausschlussfunktion verwenden, um nach Dateinamen zu filtern.
Marlar