即使/tmp没有名为something的文件,使用find搜索它也将返回0:

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


find找不到时,如何获得非零退出状态什么?

#1 楼

find /tmp -name something | grep .

发现某物时返回状态为0,否则返回非零。
编辑:由于结果相同,因此从egrep '.*'更改为更简单的grep .

评论


egrep正则表达式上的结尾*是完全多余的。由于您未使用egrep正则表达式语法,因此普通的旧grep可能要快几微秒。

–tripleee
2015年10月30日在13:03



我学会了使用查找... |读

–山姆
19年9月6日19:53

read返回适当的退出代码,但请注意,如果有的话,它将吞噬结果

– Xerus
20年6月19日在21:01

#2 楼

最简单的解决方案,不会打印,但是在找到结果后退出0

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


评论


双引号在这里没有任何作用。

–haridsv
19年4月10日在15:16

尽管双引号没有代码功能,但它们确实使读者更清楚地知道句点字符是正则表达式而不是目录。

–佛法贝拉姆肯达(Dharma Bellamkonda)
19-10-6在16:30

如果您想要相反的操作(找到文件时退出非零值),则可以在前面添加一个求反运算符!查找/ tmp -name badfile | grep -q。

– Wisbucky
20-2-13在21:23

#3 楼

退出0很容易找到,而退出> 0则更困难,因为通常只会在发生错误的情况下发生
。但是,我们可以实现它:

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


评论


据我所知,这是行不通的。 find的退出代码似乎并不取决于它运行的任何-execs的退出代码。

–克里斯
17年12月14日下午14:51

像时钟一样工作。该解决方案的一大优势是它不使用子外壳管道-很好地满足了一些脚本需求。

–Timur
19-09-18在9:38

不,这不会像提出的问题那样起作用。如果找到文件,此解决方案将返回1。如果找到该文件,它将返回0。这与OP要求的相反。但是,此解决方案确实是一个概念。它只是无法回答问题。

–滑鼠
20 May 26 '20:40

@shrewmouse我认为您不了解该代码段在做什么。仔细注意if ... else是否倒转以解决您的问题

–史蒂芬·潘妮(Steven Penny)
20-05-26在22:37

该文件名应带有-quit后缀,以在找到文件后立即退出。

–米歇尔·卡迪拉克(MichaëlCadilhac)
1月2日23:36

#4 楼

在尝试找到解决Puppet的问题的方式时刚刚发现了这个问题(更改目录下文件夹的权限,但没有更改目录本身的权限),这似乎可行:

test -n "$(find /tmp -name something)"


我的特定用例是:

test -n "$(find /home -mindepth 1 -maxdepth 1 -perm -711)"


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

评论


这里的一些解决方案(没有尝试全部)在Mac上不起作用。做到了。

–亚历克斯·霍尔
19年2月8日在7:24

只是要注意,如果人们发现它比使用test更可读,也可以写为[[-n“ $(...)”]]。

– dimo414
20-2-22在3:19

#5 楼

这是不可能的。如果成功退出,即使找不到文件,Find也会返回0(这是正确的结果,当文件确实不存在时,它并不表示错误)。

引用查找手册页


退出状态

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


根据您要实现的目标,可以尝试找到-print文件名并针对其输出进行测试:

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


评论


尽管没有人们想要的强大,但它当然是可能的。

–俄罗斯
18-2-19在7:27



手册页组织不良; Ruslan所说的内容记录在exec / execdir选项下(与+一起使用):如果任何调用返回非零值作为退出状态,则find返回非零退出状态。

– Tgr
19年4月20日在2:12

#6 楼

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

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


评论


在这种情况下,如果find出错,它将结果打印到/ dev / null,返回非零出口,然后通过test命令将其固定为0。

– Jeff Ferland
13年2月6日在19:24

我不相信那是真的。请描述您的示例。如果出现错误并找到退出,则字符串将为空,并且测试将返回非零。

–丹诺顿
13年2月7日在18:10



我不确定您的示例可能是什么,但是我意外地省略了-print -quit,这可能会解决您的问题。

–丹诺顿
13年2月7日在18:19

也许其他赞成投票的人(大概出于相同的原因)可以提供相反的例子吗?

–丹诺顿
13年2月7日在22:04

好的,您就是不喜欢我的风格。对于我的用例,发现的任何错误都可能是噪音,或者是非常严重的,以致它们将显示在其他位置。无论如何,此方法都能正确回答最终问题:“路径中是否存在具有给定名称的可访问文件”。错误将返回正确的答案“否”。如果我想找出原因,则可以添加更复杂的代码来回答最初未在此处提出的问题。

–丹诺顿
2013年2月7日在22:31



#7 楼

这是一个我称为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 0find并将out变量拆分为空,或者只需为其添加打印语句。

#8 楼

成功时,不仅find返回退出状态代码为零。在UNIX中,无论执行什么命令,如果命令执行成功,它将返回退出状态为零。