Bash - 找到exec返回值

时间:2015-07-30 00:04:49

标签: linux bash

我需要一种方法来判断grep是否确实找到了某些内容,并且理想情况下将该返回值传递给if语句。

我们说我有一个tmp文件夹(当前文件夹),因为有几个文件和子文件夹。我想搜索名为abc的所有文件以获取模式xyz。如果发现任何xyz的发生(假设找到xyz的次数无关紧要),则认为搜索成功。如果未找到xyz,则搜索失败。

在bash中,可以这样做:

find . -name "abc" -exec grep "xyz" {} \;

如果找到xyz则会显示。但我不确定如何将结果(成功与否)传回if声明。

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:2)

你可以尝试

x=`find . -name abc | xargs grep xyz`
echo $x

也就是说,x包含您的返回值。没有匹配时它是空白的。

答案 1 :(得分:2)

如果您想知道IProtocol找到一些文件find并且其中至少有一个文件包含字符串abc,那么您可以使用:

xyz

这依赖于if find . -name 'abc' -type f -exec grep -q xyz {} + then : All invocations of grep found at least one xyz and nothing else failed else : One or more invocations of grep failed to find xyz or something else failed fi 返回其自身操作的退出状态,以及它执行的任何命令的非零退出状态。最后组find将与+一样多的文件名认为是合理的一个命令行。您需要相当多的文件名(大量相当长的名称)才能使find多次运行find。在运行Mac OS X 10.10.4的Mac上,我得到了大约3,000个文件,每个文件名称大约有32个字符,参数列表刚刚超过100 KiB,没有grep多次运行。 OTOH,当我有不到8000个文件时,我得到两次grep,每个参数列表大约130 KiB。

有人简短地留下评论,询问find的退出状态是否有保证。答案是“是”' - 虽然我不得不稍微修改一下退出状态的描述。在grep的描述下,POSIX指定:

  

如果任何调用 ['实用程序',例如此问题中的-exec] 返回非零值作为退出状态,则{{1实用程序将返回非零退出状态。

根据一般退出状态'它说:

  

应返回以下退出值:

     

grep - 成功遍历所有路径操作数    find - 发生错误。

因此,只要没有自己的操作失败并且只要它调用的0命令都没有失败,>0就会报告成功。找到零文件,但没有失败将被报告为成功。 (例如,失败可能缺乏搜索目录的权限。)

答案 2 :(得分:1)

find返回-exec' d命令的结果作为结果,只需将命令放在if语句中:

if [[ -n $(find . -name "abc" -exec grep "xyz" {} \;) ]]
then
   # do something
fi

答案 3 :(得分:1)

可以为grep命令提供-q选项,该选项将“安静”#34;它的输出。 Grep将根据您是否在您指向的文件中找到任何内容来返回成功或失败。

如果你的shell能够使用它,而不是试图解析find命令的输出,你可能想尝试使用for循环。例如在bash中:

shopt -s globstar

cd /some/directory

for file in **/abc; do
  grep -q "xyz" "$file" && echo "Found something in $file"
done

这是你正在寻找的吗?

答案 4 :(得分:1)

你应该能够用--include grep来做到这一点。我相信。

像这样:

if grep -r --include=abc -q xyz; then
    : Found at least one match
else
    : No matching lines found
fi