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

yae*_*ael 85 find

即使/tmp没有文件调用something,搜索它find也会返回 0:

  $ find /tmp -name something 
  $ echo $?
  0
Run Code Online (Sandbox Code Playgroud)

find找不到任何东西时,如何获得非零退出状态?

Ste*_*day 73

find /tmp -name something | grep .
Run Code Online (Sandbox Code Playgroud)

返回状态将0是找到某物时,否则为非零。

编辑:更改egrep '.*'为更简单的grep .,因为结果是相同的。

  • `egrep` 正则表达式的尾随 `*` 是完全多余的。由于您没有使用 `egrep` 正则表达式语法,普通的旧 `grep` 可能会快几微秒。 (14认同)
  • 我学会了使用`find ... | 阅读` (2认同)

Ste*_*nny 26

使用 find 退出 0 很容易,退出 >0 更难,因为这通常只会发生错误。但是我们可以让它发生:

if find -type f -exec false {} +
then
  echo 'nothing found'
else
  echo 'something found'
fi
Run Code Online (Sandbox Code Playgroud)

  • 据我所知,这行不通。`find` 的退出代码似乎不依赖于它运行的任何 `-exec` 的退出代码。 (5认同)
  • 要回答 `find` 是否依赖于 `-exec` 的退出代码,手册中的以下简介很有用:“如果任何使用 `+` 形式的调用返回一个非零值作为退出状态,则 find 返回一个非零退出状态。” (5认同)
  • 应以“-quit”为后缀,以便在找到文件后立即退出。 (3认同)
  • 像时钟一样工作。此解决方案的一大优点是它不使用子shell 管道 - 非常适合某些脚本需求。 (2认同)

小智 23

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

find /tmp -name something | grep -q "."
Run Code Online (Sandbox Code Playgroud)

  • 双引号在这里没有任何意义。 (5认同)
  • 虽然双引号没有代码功能,但它们确实让读者更清楚地知道句点字符是正则表达式而不是目录。 (4认同)
  • 如果你想要相反的结果(找到文件时以非零值退出),你可以在`!前面添加一个否定运算符。查找 /tmp -名称坏文件 | grep -q 。` (2认同)

she*_*n89 12

刚刚发现这个问题,同时试图找到解决 Puppet 问题的方法(更改目录下文件夹的权限,但不更改目录本身的权限),这似乎有效:

test -n "$(find /tmp -name something)"
Run Code Online (Sandbox Code Playgroud)

我的具体用例是这样的:

test -n "$(find /home -mindepth 1 -maxdepth 1 -perm -711)"
Run Code Online (Sandbox Code Playgroud)

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


Sve*_*ven 6

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

引用查找联机帮助页

退出状态

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

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

#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
    echo "Notfound"
else
   echo $MYVAR
fi
Run Code Online (Sandbox Code Playgroud)