rsync‘无法删除非空目录’错误,即使使用--force选项

rsync‘无法删除非空目录’错误,即使使用--force选项

运行此命令时:

$ 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到命令中以明确这不是文件权限问题。

答案1

您尝试添加--delete-excluded吗?

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

答案2

以下是此问题的可能根源:

(1)此错误可能是由于-b(--backup)选项。此选项将通过附加波浪符号 (~) 在其文件名上。 (这让我很困惑,因为文件名显然是备份,但目录名不是,因为您看不到波浪号。)

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

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

(2)--exclude 选项可以产生相同的结果。您的情况可能就是这样。模式系统功能强大,但可能会产生误导。例如,如果您写入 --exclude='*~',这将跳过所有以波浪符号结尾的文件,结果与上面的情况 (1) 完全相同。

来自 rsync 手册页:

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

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

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

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

答案3

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

这个答案了解详情。

答案4

目录必须是空的才能删除它,文件系统通常要求这样做。

因此通常rsyncrm会首先递归删除所有内容然后再删除现在为空的目录。

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

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

相关内容