为什么使用 find -exec 删除目录会生成错误消息?

Pau*_*l R 2 osx bash bsd find rm

为什么是这样:

find . -type d -name test -exec rm -r {} \;
Run Code Online (Sandbox Code Playgroud)

生成错误消息:

find: ./foo/test: No such file or directory
find: ./bar/test: No such file or directory
find: ./blech/test: No such file or directory
Run Code Online (Sandbox Code Playgroud)

即使它实际上删除了相关目录?

这是 OS X (10.10)。

sch*_*ily 6

Find 用于readdir()从目录中获取内容。

由于 readdir() 是一个实现缓存的库函数,find即使没有缓存也无法知道被调用的程序删除了刚刚发现的目录,因此标准的 find 调用总是会导致此类错误。

您的问题有一个干净的解决方案:

find . -depth ...

(用 find 命令行的其余部分替换 ...)

将告诉find在目录本身之前处理所有目录内容。

顺便说一句:我建议您阅读find手册页。26 年来,有一个比-exec ... {} \;这更好的解决方案,因为它很慢并且为每次点击创建一个子流程。查找-exec ... {} +,因为这会收集路径名,直到达到参数的最大大小。