如何检测“查找”是否找到任何匹配项?

Chr*_*age 15 osx find

是否有一种惯用的方法来检测“查找”是否找到了任何匹配项?我目前正在使用

COUNT=`find ... | wc -l`
if [ "$COUNT" -gt 0 ]; then
Run Code Online (Sandbox Code Playgroud)

但这对我来说似乎有点间接。另外,我希望 find 一旦找到匹配项就停止搜索,这样就不会浪费时间和精力。我只需要知道是否有任何匹配的文件。

更新:我犯了在没有代码的情况下编写问题的错误:我wc -l在不同的情况下使用,无论如何我需要知道找到的文件总数。在我只测试是否有任何匹配的情况下,我使用if [ -z $(find …) ].

Gil*_*il' 16

如果您知道您有 GNU find,请使用-quit 使其在第一次匹配后停止。

可移植地,将输出通过管道传输findhead -n 1. 这种方式find将在几次匹配后(当它被填充head的输入缓冲区时)死于管道破裂。

无论哪种方式,您都不需要wc测试字符串是否为空,shell 可以自行完成。

if [ -n "$(find … | head -n 1)" ]; then …
Run Code Online (Sandbox Code Playgroud)

  • @fred:相反,`-n` 测试字符串是否为空,它与变量无关。您所读到的内容可能是说使用 `-n` 不会测试是否定义了变量:如果 `foo` 已定义但为空,则 `-n "$foo"` 为假,并在 `-n` 下显示错误消息设置 -u`。`[ -n "${foo+1}" ]` 可靠地测试是否设置了 `foo`,但同样对待空变量和未设置变量通常是一个好主意:`[ -n "${foo:+1}" ] `,或者只是 `[ -n "$foo" ]`,如果你不担心 `set -u`。 (2认同)

cjm*_*cjm 7

您可以使用该-quit操作在第一场比赛后停止。您可能希望将它与另一个操作(如-print)结合起来,否则您将无法判断它是否找到了任何东西。

例如,find ... -print -quit将打印第一个匹配文件的路径然后退出。或者,-printf 1 -quit如果有匹配项,您可以使用打印 1,如果不匹配则不打印任何内容。

find的退出状态反映搜索时是否有错误,而不是它是否找到任何东西,因此您必须检查其输出以查看是否有匹配项。