我需要一种方法来判断grep是否找到了什么,并理想地将返回值传递给if语句。
假设我有一个tmp
文件夹(当前文件夹),在有几个文件和子文件夹。我想搜索所有文件名为abc
的模式xyz
。搜索被认为是成功的,如果它发现任何出现xyz
(不管找到xyz
多少次)。如果没有找到xyz
,则搜索失败。
在bash中,可以这样做:
find . -name "abc" -exec grep "xyz" {} \;
字符串
这将显示是否找到了xyz
,但我不确定如何将结果(成功与否)传递回if
语句。
如果你能帮忙的话,我将不胜感激。
5条答案
按热度按时间2q5ifsrm1#
你可以尝试
字符串
或者,正确处理文件名中的空格和尾行:
型
也就是说,x包含了你的返回值。当没有匹配项时,它是空的。
332nm8kg2#
如果你想知道
find
找到了一些文件abc
,并且其中至少有一个文件包含字符串xyz
,那么你可以用途:字符串
这依赖于
find
返回其自身操作的退出状态,以及它所执行的任何命令的非零退出状态。最后的+
将find
认为合理的尽可能多的文件名分组到单个命令行中。您需要相当多的文件名(大量相当长的名称)来使find
多次运行grep
。在运行Mac OS X 10. 10. 4的Mac上,我得到了大约3,000个文件,每个文件的名称中大约有32个字符,对于一个刚刚超过100 KiB的参数列表,没有grep
被运行多次。OTOH,当我有不到8000个文件时,我得到了两次grep
的运行,每次大约130 KiB的参数列表。有人简短地留下了一条评论,询问
find
的退出状态是否得到保证。答案是“yes”-尽管我不得不修改一下我对退出状态的描述。在-exec
的描述下,POSIX指定:如果任何调用 ['实用程序',例如本问题中的
grep
] 返回非零值作为退出状态,则find
实用程序应返回非零退出状态。在一般的“退出状态”下,它说:
应返回以下退出值:
0
-成功遍历所有路径操作数。>0
-发生错误。因此,只要
find
自己的操作没有失败,并且只要它调用的grep
命令没有失败,find
就将报告成功。找到零个文件但没有失败将被报告为成功。(失败可能是缺乏搜索目录的权限,例如。)tcbh2hod3#
find返回
-exec
'd命令的结果作为其结果,只需将命令放在if语句中:字符串
m3eecexj4#
可以给
grep
命令提供一个-q
选项,该选项将使其输出“安静”。Grep将根据是否在您指向的文件中找到任何内容返回成功或失败。如果你的shell有这个能力,而不是试图解析
find
命令的输出,你可能想尝试使用for
循环。例如在bash中:字符串
你在找这个吗?
eqfvzcg85#
我相信你应该可以用grep和
--include
来做到这一点。就像这样:
字符串