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

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

为什么会这样:

find . -type d -name test -exec rm -r {} \;

生成错误消息:

find: ./foo/test: No such file or directory
find: ./bar/test: No such file or directory
find: ./blech/test: No such file or directory

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

这是 OS X (10.10) 的情况。

答案1

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

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

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

find . -depth ...

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

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

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

答案2

原问题

-execup to之后的所有单词\;都被解释为参数,即它们由运行命令的 shell 展开(您可以尝试如果{}存在名为 的目录会发生什么),但随后它们会被解释为引用的形式。你需要一个 shell 来扩展 glob:

find . -type d -exec bash -c 'echo {}/*' \;

更新

删除目录时,删除父目录后,您将无法再删除其子目录 - 它们已经消失了。

相关内容