我已经在查找的手册页上进行了掩饰,-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
进行了。
答案 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
检测到的错误。