/tmp
没有名为something
的文件,使用find
搜索它也将返回0: $ find /tmp -name something
$ echo $?
0
当
find
找不到时,如何获得非零退出状态什么?#1 楼
find /tmp -name something | grep .
发现某物时返回状态为
0
,否则返回非零。编辑:由于结果相同,因此从
egrep '.*'
更改为更简单的grep .
。#2 楼
最简单的解决方案,不会打印,但是在找到结果后退出0find /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 0
的find
并将out变量拆分为空,或者只需为其添加打印语句。#8 楼
成功时,不仅find
返回退出状态代码为零。在UNIX中,无论执行什么命令,如果命令执行成功,它将返回退出状态为零。
评论
egrep正则表达式上的结尾*是完全多余的。由于您未使用egrep正则表达式语法,因此普通的旧grep可能要快几微秒。
–tripleee
2015年10月30日在13:03
我学会了使用查找... |读
–山姆
19年9月6日19:53
read返回适当的退出代码,但请注意,如果有的话,它将吞噬结果
– Xerus
20年6月19日在21:01