虽然查找-exec rm工作,但是非零返回代码

我在一个Linux系统我不知道什么是以下执行find的错误:

mkdir a && touch a/b find . -name a -type d -exec echo '{}' \; ./a find . -name a -type d -exec rm -r '{}' \; find: `./a': No such file or directory 

echo的调用仅用于testing目的。 我期望最后的命令完全删除目录“./a”并返回0.相反,它将删除目录并生成错误消息。 重复,它确实删除目录! 到底是怎么回事?

rm执行没有问题。 这个问题是, find是困惑的,因为它知道目录./a在那里,它试图访问该目录来寻找名为a目录。 但是,找不到目录,因为它已经被删除。

避免这种情况的一个办法就是做

 find -name a -type d | xargs rm -r 

这会让执行rm命令之前的查找动作。 或者,您可以简单地忽略原始命令中的错误。

基于epsalon的评论,解决方案是使用-depth选项,这会导致首先访问更深的文件。

 find . -depth -name a -type d -exec rm -r '{}' \; 

做的伎俩。 谢谢一堆!

如果性能是一个问题,请使用-prune以防止查找降级到名为“a”的目录中:

 find . -name a -type d -prune -exec rm -r '{}' \;