find:如何强制非零退出状态

时间:2014-01-21 09:07:31

标签: linux find

我已经在查找的手册页上进行了掩饰,-quit似乎部分地执行了我想要的操作,但它只会导致find在发生错误时返回非零值。那么find如何被迫返回非零或至少被欺骗以一种维护者可读的方式返回非零?到目前为止,我有这个例子:

$ find . -maxdepth 2 -type f \( -exec echo {} \; -o \( -printf "FAIL\n" -a -quit \) \)
./scooby
./shaggy
./velma
./daphne
./fred
$ echo $?
0

但是如果我用一个false调用替换echo,我会得到所需的提前退出,但没有非零退出代码:

$ find . -maxdepth 2 -type f \( -exec false {} \; -o \( -printf "FAIL\n" -a -quit \) \)
FAIL
$ echo $?
0

更新

-exec返回false时,我试图让find返回非零值,即执行的命令返回非零值。目前,find只是将非零-exec调用转换为布尔状态,以用作find表达式的一部分。

$ find . -maxdepth 2 -type f \( -exec chmod a+x {} \; -o \( -printf "FAIL\n" -a -quit \) \)

如果chmod失败,这当前将永远不会返回非零。我希望能够在chmod失败时返回非零,并且能够提前退出,这已经使用-quit进行了。

2 个答案:

答案 0 :(得分:2)

如果您总是想要返回非零退出代码,请使用&& false,如下所示:

find . -maxdepth 2 -type f ...  && false

使用grep查找由FAIL打印的特殊find字符串。如果exec失败则返回零,否则返回非零。

$ find . -maxdepth 2 -type f \( -exec chmod a+x {} \; -o \( -printf "FAIL\n" -a -quit \) \) | grep -q "FAIL"

答案 1 :(得分:0)

我认为滥用find的退出代码来陈述结果不是一个好主意。它将阻止find报告错误的标准方式(例如I / O错误,权限被拒绝错误等)。

我认为你真的应该使用find的某种输出来陈述结果并检查它。

rm ./findResult 2>/dev/null
find /path/to/my/dir -name '*my*pattern*' -fprintf ./findResult "fail" -quit
result=$(cat ./findResult 2>/dev/null || echo "success")

通过这种方式,您可以获得返回值的一般方法(不仅仅是8位int,而是任意字符串)。另一方面,使用退出代码甚至可以掩盖find检测到的错误。