Answers:
最简单的解决方案,不打印,但在找到结果时退出0
find /tmp -name something | grep -q "."
退出0很容易找到,而退出> 0则更困难,因为这通常仅在发生错误时发生。但是,我们可以实现它:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
find
似乎并不取决于-exec
它运行的任何s 的退出代码。
exec
节中,而不是在返回值下方)。它无法区分未找到和发现自身出错(例如,在不存在的起点上调用它时)。
这是不可能的。如果成功退出,即使找不到文件,Find也会返回0(这是正确的结果,当文件确实不存在时,它并不表示错误)。
引用查找手册页
退出状态
如果所有文件都已成功处理,则find会以状态0退出;如果发生错误,则大于0。这是故意的非常宽泛的描述,但是如果返回值不为零,则不应依赖find结果的正确性。
根据您要实现的目标,您可以尝试找到-print
文件名并根据其输出进行测试:
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec
/ execdir
选项下(与一起使用+
):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
我觉得这是最简洁直接的方法:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit
,这可能会解决您的问题。
这是我叫的一个小脚本test.py
。它改进了其他发布的方法,如果设置了一个,它将返回一个错误代码,如果find没有列出任何文件,它将另外设置一个:
from subprocess import Popen
import sys
p = Popen(['find'] + sys.argv)
out, err = p.communicate()
if p.returncode:
sys.exit(p.returncode)
if not out:
sys.exit(1)
这是命令行输出:
$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1
然后,对于find出错但找到文件的结果:
$ ls -lh
$ d--------- 2 jeff users 6 Feb 6 11:49 noentry
$ find .
.
./noentry
find: `./noentry': Permission denied
$ echo $?
1
$ find . | egrep '.*'
.
./noentry
find: `./noentry': Permission denied
$ echo $?
0
python ../test.py
../test.py
$ echo $?
1
然后,如果您想要文件列表,则可以使用-print 0
传递给find
且将out变量拆分为null的方法,也可以仅为其添加打印语句。
find
成功时,不仅返回退出状态代码为零。在UNIX中,无论执行什么命令,如果命令执行成功,它将返回退出状态为零。
*
上的结尾egrep
是完全多余的。由于您没有使用egrep
正则表达式语法,因此纯老式grep
可能要快几微秒。