GNU 的手册页find
清楚地警告说 using-delete
暗示-depth
. 但是,我找不到对此要求的任何解释:
-delete
删除文件; 如果删除成功,则为 true。如果删除失败,则会发出错误消息。[…] 使用-delete
自动打开该-depth
选项。
find --version
find (GNU findutils) 4.8.0
这隐含地是一个后序遍历:
find /path -type f -delete
但这是一个前序遍历,通常的遍历方法find
:
find /path -type f -exec rm -f {} +
如果我想使用-prune
我不能使用-delete
,我必须使用更麻烦-exec rm {} +
的,但最终效果似乎是一样的。
该-delete
操作不会删除目录,那么为什么find -delete
需要暗示-depth
?
对于 GNU 实用程序,参考文档是实用程序的信息文件,而不是它们的手册页;正如在某些情况下发生的那样,问题中引用的手册页具有误导性。
find -delete
可以删除目录:-delete
find
自2004 年(findutils
4.2.3)在 GNU 中引入以来,一直支持删除目录。删除目录的原因是
-delete
:-depth
它只能删除以前清空过的目录。-delete
on 目录等价于rmdir
,而不是rm -rf
.find /path -type f -delete
和的最终效果find /path -type f -exec rm -f {} +
是相同的,因为两个find
调用都将它们的操作限制在文件中。由于只删除文件,因此删除它们的顺序对find
' 的遍历没有影响。删除目录时,find
的遍历确实起作用。如果-delete
在目录上使用 ,则必须先处理完目录的所有子目录,然后才能删除目录本身;这-depth
是有用的地方。如果rm -rf
在被遍历的目录上使用,则find
必须在尝试遍历已删除目录的子目录之前告知删除;这是一个-prune
有用的例子。可以想象对其进行特殊处理,以便它不会设置
-depth
是否不删除目录,但在一般情况下无法提前确定。(-depth
是一个选项,而不是一个动作;它需要在实际处理第一个动作之前设置。)或者,正如过去提出的那样,可以想象根本没有任何特殊处理
-delete
,并让用户负责确保-delete
在必要时可以完成其工作。但是,这会破坏向后兼容性以及与已复制的其他实现的兼容性-delete
。另见Savannah bug #20865 中的讨论。GNU从 4.3.11 版本开始
findutils
显式检查-delete
组合 with-prune
-depth
,如果没有显式设置则中止。评论指出正如在 find without delete 无法找到它们时,为什么 find with -delete 会擦除我的 /save/ 目录中的文件中所讨论的那样?,如果您使用的是 GNU
find
,则应该-execdir rm {} +
使用-exec rm {} +
.