运行这个命令时:
$ 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 /”
一个目录必须是空的才能删除它,文件系统通常需要这个目录。
因此,通常rsync
或rm
会recursion地删除所有的内容,然后才删除now-empty目录。
如果当前用户不是所有文件的所有者,则文件系统权限将不允许您删除这些文件。 由于它们不会被删除,所以目录不会被清空,删除将会失败。
我的第一个猜测是这些目录中的某些文件是由另一个用户拥有的,例如apache或nobody用户。