rsync“无法删除非空目录”错误,即使使用--force选项也是如此


28

运行此命令时:

$ 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基本系统版本2.0.3上使用rsync版本3.0.8。

更新:已添加sudo到命令中,以明确表明这不是文件权限问题。


目标是什么文件系统?文件系统需要修复吗?
Marcus Downing

文件系统是ext3。文件系统可能需要或需要修复。我将fsck抓住下一个机会,并提供最新结果。
tommarshall 2014年

我刚刚找到fsck系统,这个问题仍然存在。
tommarshall 2014年

Answers:


39

您是否尝试添加--delete-excluded

如果您在“远程”侧的排除文件夹中删除目录,rsync --delete则不会删除“本地”站点上的排除文件夹。


有一个文件夹,名为uploadshtml/js/ckeditor/_source/plugins/uicolor/yuihtml/js/ckeditor/_sampleshtml/js/ckeditor/plugins/uicolor/yui目录。谢谢你的帮助。
tommarshall

如果使用,--delete-excluded但仍要删除某些文件/目录,则可以将此文件/目录放在中--filter 'protect some_dir/',例如:rsync -ac --delete --delete-excluded --exclude '*.html' --filter 'protect .git/' . /target/destination/
alexandre1985

6

这是此问题的可能来源:

(1)此错误可能是-b(--backup)选项的结果。此选项将通过在文件名后附加波浪号()为每个已删除文件创建备份。(这让我感到困惑,因为文件名显然是备份,但目录名却不是,因为您看不到波浪号。)

要检查是否相同,请在最深层阅读目标目录,并检查是否有代字号(〜)结尾文件。请注意,这些tilde-appended-files-names在某些常见的文件浏览系统中是不可见的,因此您可能看不到它们。

要解决这种情况,请首选--backup-dir = DIR选项,例如--backup-dir = .rsync_bak。

(2)所述的--exclude选项可以具有相同的结果。您的情况可能正在发生这种情况。模式系统功能强大,但可能会产生误导。例如,如果您编写--exclude ='*〜',将跳过所有波浪号结尾文件,其结果与上述情况(1)完全相同。

从rsync手册页:

如果模式以/开头,则将其锚定到文件层次结构中的特定位置,否则将与路径名的末尾匹配

例如,如果您编写--exclude = uploads,则将在文件树的任何级别上排除所有名为“ updloads” 的文件。

检查无法删除目录中是否有一个名为“ uploads”的文件。

解决方法是将“ --exclude = uploads”更改为“ --exclude = uploads /”


0

在我的设置中((来源为Ubuntu格式类型ext4,以Western Western类型的fuseblk为目标),它可以使用:

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

2
哪一部分可以真正解决问题?
迈克尔·汉普顿

0

在过滤器文件中使用规则,而不是--exclude。这些允许您将排除项标记为“可持久”,这将使您删除包含排除文件的非空目录。

有关详细信息,请参见此答案


-1

目录必须为空才能删除它,文件系统通常要求该目录。

因此,通常rsyncrm将首先递归删除所有内容,然后才删除空目录。

如果当前用户不是所有文件的所有者,则文件系统权限将不允许您删除这些文件。由于它们不会被删除,因此不会清空目录,并且删除将失败。

我的第一个猜想是那些目录中的某些文件是由另一个用户拥有的,例如apache或nobody用户。


谢谢。目录中的文件确实由apache组中的用户拥有,但是我只是尝试以该用户身份运行此命令,并遇到相同的错误。
tommarshall 2014年

另外,如果是文件权限问题,我希望运行与'sudo'相同的命令来解决此问题,但事实并非如此。但是,如果我弄错了,请对此进行纠正。
tommarshall 2014年

1
以root身份运行命令应该可以解决大多数权限问题,是的。(可能仍然失败的地方是在nfs挂载上命名为一个,另一个是不可变文件)进行简单检查,ls -la以查看目录为何仍不为空。lsattr将显示不可变的文件。
HBruijn 2014年

感谢您提供其他信息,但是lsattr从列出的目录之一输出以下内容:(--------------- ./assets无i标志),并且该文件不在nfs装载中。您是否还有其他原因想出为什么该命令仍会因sudo而失败?
tommarshall 2014年

那里有任何符号链接,还是只有真实文件?
Marcus Downing
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.