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

Tho*_*mas 4 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
Run Code Online (Sandbox Code Playgroud)

echo的调用仅用于测试目的.我希望最后一个命令完全删除目录'./a'并返回0.而是删除目录并生成错误消息.重复一遍,它确实删除了目录!到底是怎么回事?

eps*_*lon 10

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

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

find -name a -type d | xargs rm -r
Run Code Online (Sandbox Code Playgroud)

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


Tho*_*mas 6

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

find . -depth -name a -type d -exec rm -r '{}' \;
Run Code Online (Sandbox Code Playgroud)

诀窍.谢谢你!

  • 实际上,原始代码的工作速度比`-depth`快,你可以忽略错误. (2认同)

小智 5

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

find . -name a -type d -prune -exec rm -r '{}' \;
Run Code Online (Sandbox Code Playgroud)