即使使用了–force选项,rsync也不能删除非空目录的错误

运行这个命令时:

$ 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删除--delete-excluded

    消息cannot delete non-empty directory很容易发生,如果删除源端的目录,然后你想运行rsync --delete删除。 Rsync不会让您删除目录中排除的文件。

    以下是这个问题的可能来源:

    (1)此错误可能是-b (–backup)选项的结果。 此选项将通过在其文件名上附加波形符号( )来创build每个已删除文件的备份。 (这使我感到困惑,因为文件名显然是一个备份,但目录名不是,因为你看不到代字号。)

    要检查这是否是相同的情况,请在最深层次上读取目标目录,并检查是否有任何代字号(〜)结尾文件。 请注意,在一些常用的文件浏览系统中,这些附加波浪号的文件名是不可见的,因此您可能看不到它们。

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

    (2) –exclude选项可以有相同的结果。 你的情况可能发生这种情况。 该模式系统是强大的,但可能会误导。 例如,如果你写了–exclude ='*〜',这将会跳过所有的波形结尾文件,就像上面的情况(1)一样。

    从rsync手册页:

    如果模式以/开始,则它锚定到文件层次结构中的特定位置,否则将匹配path名的结尾

    如果你写了–exclude = uploads,这将会在文件树的任何级别上排除名为“updloads”的所有文件。

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

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

    一个目录必须是空的才能删除它,文件系统通常需要这个目录。

    因此,通常rsyncrm会recursion地删除所有的内容,然后才删除now-empty目录。

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

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