甚至当/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 0
来find
和分割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`