当没有find匹配的文件时,我可以使`find`返回非0吗?

甚至当/tmp没有调用something文件时,用find来search它将返回0:

  $ find /tmp -name something $ echo $? 0 

当找不到任何东西时,我怎样才能得到一个非零的退出状态?

这里是我相信做你想要的一行:

 find /tmp -name something | egrep '.*' 

发现事物时返回状态为0 ,否则为非零。

如果您还需要捕获find的输出以进一步处理,那么SvenW的答案已经涵盖了这一点。

退出0很容易find,退出> 0更困难,因为通常只会发生错误。 但是,我们可以做到这一点:

 if find -type f -exec false {} + then echo 'nothing found' else echo 'something found' fi 

这是不可能的。 如果成功退出,则返回0,即使它没有find文件(当文件确实不存在时,这是一个正确的结果,但表示错误)。

引用查找手册页

退出状态

如果所有文件都成功处理,则查找状态为0的退出,如果发生错误,则查找大于0的退出。 这是一个非常宽泛的描述,但是如果返回值不为零,则不应该依赖查找结果的正确性。

根据你想要达到的目标,你可以试着find-print的文件名并对它的输出进行testing:

 #!/bin/bash MYVAR=`find . -name "something" -print` if [ -z "$MYVAR" ]; then echo "Notfound" else echo $MYVAR fi 

最简单的解决scheme,不打印,但find结果时退出0

 find /tmp -name something | grep -q "." 

不仅find成功时返回退出状态码为零。 在unix中,执行什么命令,如果成功则返回退出状态为零。

这里有一个叫做test.py的小脚本。 它改进了张贴的其他方法,它将返回一个错误代码,如果一个被设置,并且它另外设置一个如果发现没有列出任何文件:

 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有错误,但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 0find和分割nullvariables,或者你可以添加一个打印语句。

刚刚发现这个问题,同时试图find我的方式来解决傀儡问题(更改目录下文件夹的权限,但不是在目录本身),这似乎工作:

 ! test -z $(find /tmp -name something) 

我的具体用例是这样的:

 ! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711) 

如果find命令找不到具有所需权限的文件,将退出代码1。

我觉得这是最简洁直接的方法:

 test `find /tmp/ -name something -print -quit 2>/dev/null`