非零返回代码虽然找到-exec rm工作

时间:2012-09-16 19:35:16

标签: linux shell

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

3 个答案:

答案 0 :(得分:10)

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

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

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

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

答案 1 :(得分:6)

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

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

诀窍。非常感谢!

答案 2 :(得分:4)

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

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