Rsync

rsync ‘cannot delete non-empty directory’ 錯誤,即使使用 –force 選項

  • February 18, 2019

執行此命令時:

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

我得到以下輸出:

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

從閱讀man rsync中我的印像是,該--force選項會告訴 rsync 刪除這些非空目錄,這是預期的結果。

參考:

--force                 force deletion of dirs even if not empty

如何修改命令以刪除非空目錄?

我在 Gentoo Base System 版本 2.0.3 上使用 rsync 版本 3.0.8,以防萬一。

**更新:**添加sudo到命令中以明確這不是文件權限問題。

您是否嘗試添加--delete-excluded

如果您在“遠端”端刪除排除文件夾中的目錄,rsync --delete則不會刪除“本地”站點上的排除文件夾。

以下是此問題的可能來源:

(1)此錯誤可能是-b (–backup) 選項的結果。此選項將通過在文件名上附加波浪號 ( ~ ) 來創建每個已刪除文件的備份。(這讓我很困惑,因為文件名顯然是備份,但目錄名不是,因為你看不到波浪號。)

要檢查這是否相同,請在最深層讀取目標目錄,並檢查是否有任何波浪號 (~) 結尾文件。請注意,這些波浪號附加文件名在某些常見的文件瀏覽系統中是不可見的,因此您可能看不到它們。

要解決這種情況,請首選 –backup-dir=DIR 選項,例如 –backup-dir=.rsync_bak。

(2) –exclude 選項可以有相同的結果。這可能發生在你的情況下。模式系統很強大,但可能會產生誤導。例如,如果你寫 –exclude=’*~’,這將跳過所有波浪號結尾的文件,結果與上面的情況 (1) 完全相同。

從 rsync 手冊頁:

如果模式以 / 開頭,則將其錨定到文件層次結構中的特定位置,否則與路徑名的末尾匹配

Si 如果你寫–exclude=uploads,這將排除所有名為“updloads”的文件,在你的文件樹的任何級別。

檢查無法刪除的目錄中是否有名為“uploads”的文件。

解決方案是將“–exclude=uploads”更改為“–exclude=uploads/”

引用自:https://serverfault.com/questions/573392