2014-01-21 66 views
0

我已掩盖查找的手册页,并且-quit似乎部分按照我想要的操作,除非只会在发生错误时导致find返回非零值。那么find怎么能被迫返回非零值,或者至少被欺骗成返回非零值的方式,这对维护者是可读的?到目前为止,我有这样的例子:找到:如何强制非零退出状态

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

我若为false调用替换回声,我得到所需的早早出局,但没有非零退出代码:

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

日期:

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

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

如果chmod失败,这当前不会返回非零值。我希望能够返回非零,如果chmod失败,并且提前退出,它已经使用-quit

+0

你试图实现什么(通过返回一个非零的退出代码)? – devnull

+0

我已经更新了这个问题。 – Craig

+0

那么当'chmod'失败或更多时候退出的目标是什么? – devnull

回答

2

如果你总是想返回一个非零退出代码,使用&& false如下图所示:

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

使用grep寻求通过find打印的特殊FAIL字符串。如果exec失败,它将返回零,否则返回非零。

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

只要在某些条件下,我并不总是希望退出非零。 – Craig

+0

您可以使用'grep'来查找'FAIL'字符串。 – dogbane

+0

这是在管道中,但它不是那么干净。它还需要'set -o pipefail'才能使用'set -e' – Craig

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检测到的错误。

相关问题