为什么会这样:
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
原问题
-exec
up to之后的所有单词\;
都被解释为参数,即它们由运行命令的 shell 展开(您可以尝试如果{}
存在名为 的目录会发生什么),但随后它们会被解释为引用的形式。你需要一个 shell 来扩展 glob:
find . -type d -exec bash -c 'echo {}/*' \;
更新
删除目录时,删除父目录后,您将无法再删除其子目录 - 它们已经消失了。