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 rsync
es war mein Eindruck , dass die --force
Option 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 sudo
Befehl hinzugefügt , um zu verdeutlichen, dass es sich nicht um ein Dateiberechtigungsproblem handelt.
ext3
. Möglicherweise ist das Dateisystem in Not oder repariert. Ich werdefsck
bei nächster Gelegenheit und mit den Ergebnissen aktualisieren.fsck
das System und dieses Problem ist immer noch vorhanden.Antworten:
Hast du versucht hinzuzufügen
--delete-excluded
?Wenn Sie ein Verzeichnis in Ihren ausgeschlossenen Ordnern auf der "Remote" -Seite
rsync --delete
löschen , wird der ausgeschlossene Ordner auf Ihrer "lokalen" Site nicht gelöscht.quelle
uploads
in denhtml/js/ckeditor/_source/plugins/uicolor/yui
,html/js/ckeditor/_samples
undhtml/js/ckeditor/plugins/uicolor/yui
Verzeichnissen. Danke für Ihre Hilfe.--delete-excluded
aber 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/
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:
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.
quelle
In meinem Setup ((Quelle ist Ubuntu-Format Typ ext4 bis Ziel Western Digital Typ fuseblk) funktioniert es mit:
quelle
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.
quelle
Ein Verzeichnis muss leer sein, damit Sie es löschen können. Das Dateisystem erfordert dies normalerweise.
Löschen Sie daher normalerweise
rsync
oderrm
rekursiv 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.
quelle
ls -la
um festzustellen, warum das Verzeichnis immer noch nicht leer ist.lsattr
zeigt unveränderliche Dateien an.lsattr
aus 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?