非零返回代码,尽管查找 -exec rm 有效



我在Linux系统上,我想知道以下查找执行有什么问题:

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 的调用仅用于测试目的。 我希望最后一个命令完全删除目录"./a"并返回 0。 相反,它会删除目录并生成错误消息。重复一遍,它确实删除了目录!这是怎么回事?

rm执行没有问题。问题是find很困惑,因为它知道./a目录在那里,它会尝试访问该目录以查找名为 a 的目录。但是,find 无法进入目录,因为它已被删除。

避免这种情况的一种方法是

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

这将允许查找在执行rm命令之前移动。或者,您可以简单地忽略原始命令中的错误。

根据epsalon的评论,解决方案是使用-depth选项,该选项导致首先访问更深的文件。

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

能解决问题。 谢谢一堆!

如果性能有问题,请使用 -prune 以防止 find 下降到名为"a"的目录中:

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

最新更新