rsync 'kann nicht leere Verzeichnisse nicht löschen' Fehler, auch mit der Option --force

28

Wenn Sie diesen Befehl ausführen:

$ sudo rsync -r --delete --force --checksum --exclude=uploads /data/prep/* /data/app/

Ich erhalte folgende Ausgabe:

cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source
cannot delete non-empty directory: html/js/ckeditor/_samples
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor

Aus der Lektüre den man rsynces war mein Eindruck , dass die --forceOption sagt rsync würde dies nicht leere Verzeichnisse zu löschen, was das gewünschte Ergebnis ist.

Ref:

--force                 force deletion of dirs even if not empty

Wie kann ich den Befehl ändern, um die nicht leeren Verzeichnisse zu löschen?

Ich verwende rsync Version 3.0.8 auf Gentoo Base System Release 2.0.3, falls dies relevant ist.

Update: Dem sudoBefehl hinzugefügt , um zu verdeutlichen, dass es sich nicht um ein Dateiberechtigungsproblem handelt.

tommarshall
quelle
Welches Dateisystem ist das Ziel? Muss das Dateisystem repariert werden?
Marcus Downing
Das Dateisystem ist ext3. Möglicherweise ist das Dateisystem in Not oder repariert. Ich werde fsckbei nächster Gelegenheit und mit den Ergebnissen aktualisieren.
Tommarshall
Ich hatte gerade fsckdas System und dieses Problem ist immer noch vorhanden.
Tommarshall

Antworten:

39

Hast du versucht hinzuzufügen --delete-excluded?

Wenn Sie ein Verzeichnis in Ihren ausgeschlossenen Ordnern auf der "Remote" -Seite rsync --deletelöschen , wird der ausgeschlossene Ordner auf Ihrer "lokalen" Site nicht gelöscht.

Martin Höger
quelle
Es gab einen Ordner mit dem Namen uploadsin den html/js/ckeditor/_source/plugins/uicolor/yui, html/js/ckeditor/_samplesund html/js/ckeditor/plugins/uicolor/yuiVerzeichnissen. Danke für Ihre Hilfe.
Tommarshall
Wenn Sie verwenden, --delete-excludedaber dennoch bestimmte Dateien / Verzeichnisse vom Löschen ausschließen möchten, können Sie diese Dateien / Verzeichnisse --filter 'protect some_dir/'rsync -ac --delete --delete-excluded --exclude '*.html' --filter 'protect .git/' . /target/destination/
einfügen
6

Hier sind mögliche Ursachen für dieses Problem:

(1) Dieser Fehler kann das Ergebnis der Option -b (--backup) sein. Diese Option erstellt eine Sicherungskopie jeder gelöschten Datei, indem eine Tilde ( ~ ) an den Dateinamen angehängt wird. (Dies hat mich verwirrt, da der Dateiname eindeutig eine Sicherung ist, der Verzeichnisname jedoch nicht, da Sie die Tilde nicht sehen können.)

Um zu überprüfen, ob dies der gleiche Fall ist, lesen Sie Ihr Zielverzeichnis auf der untersten Ebene und prüfen Sie, ob eine Tilde-Endungsdatei (~) vorhanden ist. Beachten Sie, dass diese Tilde-angehängten-Dateinamen in einigen gängigen Dateisuchsystemen nicht sichtbar sind, sodass Sie sie möglicherweise nicht sehen.

Um diesen Fall zu lösen, ziehen Sie die Option --backup-dir = DIR vor, z. B. --backup-dir = .rsync_bak.

(2) Die Option --exclude kann zu denselben Ergebnissen führen. Welches ist möglicherweise in Ihrem Fall passiert. Das Mustersystem ist leistungsfähig, kann aber irreführend sein. Wenn Sie zum Beispiel --exclude = '* ~' schreiben, werden alle Tilde-Enddateien übersprungen, was genau wie in Fall (1) oben ist.

aus der rsync man page:

Beginnt das Muster mit einem /, ist es an einer bestimmten Stelle in der Hierarchie der Dateien verankert, andernfalls wird es mit dem Ende des Pfadnamens abgeglichen

Wenn Sie --exclude = uploads schreiben, werden alle Dateien mit dem Namen "updloads" auf jeder Ebene Ihres Dateibaums ausgeschlossen .

Überprüfen Sie, ob sich in Ihren Verzeichnissen, die nicht gelöscht werden können, eine Datei mit dem Namen "uploads" befindet.

Die Lösung wäre, "--exclude = uploads" in "--exclude = uploads /" zu ändern.

user3586623
quelle
0

In meinem Setup ((Quelle ist Ubuntu-Format Typ ext4 bis Ziel Western Digital Typ fuseblk) funktioniert es mit:

rsync -a -v --progress --modify-window=1 -c -b -i -s -m --del -vv --ignore-errors --chmod=ugo=rwx --delete --delete-excluded  --exclude='*~'  --exclude='.*' --backup-dir=.rsync_bak /home/test /media/user/usbHDD
Vor dem Gesetz
quelle
2
Welcher Teil davon löst das Problem tatsächlich?
Michael Hampton
0

Verwenden Sie Regeln in Filterdateien anstelle von --exclude. Mit diesen können Sie Ausschlüsse als "persihable" markieren, wodurch Sie nicht leere Verzeichnisse löschen können, die ausgeschlossene Dateien enthalten.

Siehe diese Antwort für Details.

mivk
quelle
-1

Ein Verzeichnis muss leer sein, damit Sie es löschen können. Das Dateisystem erfordert dies normalerweise.

Löschen Sie daher normalerweise rsyncoder rmrekursiv zuerst den gesamten Inhalt und erst dann das jetzt leere Verzeichnis.

Wenn der aktuelle Benutzer nicht der Eigentümer aller Dateien ist, können Sie diese Dateien mit den Dateisystemberechtigungen nicht löschen. Da sie nicht entfernt werden, wird das Verzeichnis nicht geleert und das Löschen schlägt fehl.

Meine erste Vermutung wäre, dass einige Dateien in diesem Verzeichnis einem anderen Benutzer gehören, z. B. dem Apache oder keinem Benutzer.

HBruijn
quelle
Vielen Dank. Die Dateien in den Verzeichnissen gehören in der Tat einem Benutzer in der Apache-Gruppe. Ich habe jedoch gerade versucht, diesen Befehl als dieser Benutzer auszuführen, und dabei die gleichen Fehler festgestellt.
Tommarshall
Wenn es sich um ein Dateiberechtigungsproblem handelte, würde ich davon ausgehen, dass derselbe Befehl wie bei 'sudo' ausgeführt wird, um das Problem zu beheben. Dies ist jedoch nicht der Fall. Bitte korrigieren Sie mich jedoch, wenn ich mich irre.
Tommarshall
1
Wenn Sie den Befehl als root ausführen, sollten die meisten Berechtigungsprobleme behoben sein. (Wahrscheinlich befindet sich der Ort, an dem dies immer noch fehlschlagen würde, auf einem nfs-Mount, um eine unveränderliche Datei zu benennen, eine andere). Eine einfache Überprüfung, ls -laum festzustellen, warum das Verzeichnis immer noch nicht leer ist. lsattrzeigt unveränderliche Dateien an.
HBruijn
Vielen Dank für die zusätzlichen Informationen, die jedoch lsattraus einem der aufgelisteten Verzeichnisse ausgegeben werden: --------------- ./assets(no i flag), und die Datei befindet sich nicht auf einem nfs-Mount. Gibt es noch andere Gründe, warum der Befehl mit sudo immer noch fehlschlägt?
Tommarshall
Gibt es dort Symlinks oder nur echte Dateien?
Marcus Downing