为什么“查找-删除”意味着“-深度”?

roa*_*ima 8 find gnu rm

GNU 的手册页find明确警告使用-delete意味着-depth. 但是,我找不到对此要求的任何解释:

\n
\n

-delete删除文件; 如果删除成功则为 true。如果删除失败,则会发出错误消息。[\xe2\x80\xa6] 使用-delete自动打开该-depth选项。

\n
\n
find --version\nfind (GNU findutils) 4.8.0\n
Run Code Online (Sandbox Code Playgroud)\n

这隐式是后序行走:

\n
find /path -type f -delete\n
Run Code Online (Sandbox Code Playgroud)\n

但这是预序遍历,是 的常用遍历方法find

\n
find /path -type f -exec rm -f {} +\n
Run Code Online (Sandbox Code Playgroud)\n

如果我想用-prune我就不能用-delete,而必须使用更麻烦的-exec rm {} +,但最终效果似乎是一样的。

\n

-delete操作不会删除目录,那么为什么find -delete需要暗示呢-depth

\n

Ste*_*itt 13

\n

-delete操作不会删除目录,那么为什么 find-delete需要暗示呢-depth

\n
\n

对于 GNU 实用程序,参考文档是 utility\xe2\x80\x99 信息文件,而不是其手册页;在某些情况下,问题中引用的手册页具有误导性。find -delete可以删除目录

\n
\n

删除文件或目录;如果删除成功则为 true。如果删除失败,则会发出错误消息。

\n
\n

-delete自从 2004 年在 GNU 中引入以来findfindutils4.2.3),它一直支持删除目录。

\n

删除目录的原因是-delete-depth它只能删除之前已清空的目录。-delete在目录上相当于rmdir, 而不是rm -rf.

\n

find /path -type f -delete和的最终效果find /path -type f -exec rm -f {} +是相同的,因为这两个find调用都将其操作限制为文件。由于只删除文件,因此删除的顺序对find\xe2\x80\x99s 的遍历没有影响。删除目录时,find\xe2\x80\x99s 遍历确实起作用。如果-delete用于目录,则必须先处理目录\xe2\x80\x99 的子目录,然后才能删除目录本身;这就是-depth有用的地方。如果rm -rf用于正在遍历的目录,则find在尝试遍历已删除目录\xe2\x80\x99s 子目录之前必须告知删除;这是有用的一个例子-prune

\n

人们可以想象对其进行特殊处理,以便-depth如果它不删除目录,则不会设置 xe2x80x99,但在一般情况下不可能提前确定 xe2x80x99 。(-depth是一个选项,而不是一个操作;它需要在实际处理第一个操作之前设置。)

\n

或者,正如过去所提议的那样,人们可以想象根本不需要任何特殊处理-delete,并让用户负责确保-delete在必要时能够完成其工作。然而,这会破坏向后兼容性以及与已复制的其他实现的兼容性-delete。另请参阅Savannah bug #20865 中的讨论

\n

自版本 4.3.11 起, GNUfindutils 显式检查-delete组合-prune,如果-depth尚未显式设置\xe2\x80\x99,则中止。评论指出

\n
\n

我们只能侥幸逃脱,因为-delete谓词不是\n POSIX 中的。如果是的话,我们就不能在这里发出致命错误。

\n
\n

正如中所讨论的,当不带删除的查找无法找到它们时,为什么带 -delete 的查找会删除我的 /save/ 目录中的文件?,如果您\xe2\x80\x99正在使用GNU find,则应该使用-execdir rm {} +而不是-exec rm {} +.

\n

  • 谢谢。生成 Debian [bug 报告](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1003339) (2认同)