我需要一种方法来判断grep是否确实找到了某些内容,并且理想情况下将该返回值传递给if语句。
我们说我有一个tmp
文件夹(当前文件夹),因为有几个文件和子文件夹。我想搜索名为abc
的所有文件以获取模式xyz
。如果发现任何xyz
的发生(假设找到xyz
的次数无关紧要),则认为搜索成功。如果未找到xyz
,则搜索失败。
在bash中,可以这样做:
find . -name "abc" -exec grep "xyz" {} \;
如果找到xyz
则会显示。但我不确定如何将结果(成功与否)传回if
声明。
任何帮助都将不胜感激。
答案 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