我想使用 find 命令同时查找一些包含多个模式的文件。
我尝试过这样的事情:
find . -name "*.xml" -exec grep -iH keyword1 + && grep -iH "keyword2" {} \;
但上面的命令不起作用。
可以在 bash 中实现吗?
答案1
据我了解,您想要列出包含两个都“关键字1”和“关键字2”。为此,您可以-exec
按以下方式使用两个测试:
find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -iH keyword2 {} \;
这将有条件地运行第二个grep
- 如果第一个返回 true。该-q
选项阻止从第一个输出grep
,因为它将列出仅包含“keyword1”的所有文件。
由于该-H
选项将匹配行与文件名一起输出,因此您可能想使用它-l
。所以
find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -il keyword2 {} \;
这将产生与 Caleb 建议类似的输出,但不需要额外的-print
.
答案2
首先,要使用 find 执行此操作,您需要添加第二个-exec
参数。每个参数只能运行一个命令。如果您需要运行多个命令,则必须通过将一个命令设置为 shell 并运行多个命令来使用 hack。这是find
做工作的:
find . -name "*.xml" -exec grep -qi "keyword1" {} \; -exec grep -qi "keyword2" {} \; -print
请注意,我使用 find-print
选项来输出文件名,而不是让 grep 执行此操作,并使用-q
grep 选项将其置于静默模式,以便它仅给出一个返回代码,find 可以使用该返回代码来判断结果是否为无论真假,然后继续。如果到达最后一步(意味着两个文件都匹配),它将打印输出。
然而,这是低效的,因为 grep 实际上必须扫描所有文件两次。如果您的问题是字面上的意思,则必须这样做,但如果您想查找包含任何字符串的文件,您可以使用 grep 在一次传递中搜索两种模式,如下所示:
find . -name "*.xml" -exec grep -qi -e "keyword1" -e "keyword2" {} \; -print
编辑:你的问题不清楚你到底想要发生什么,而且我给出的两个例子实际上做了不同的事情。第一个是 AND 运算,仅打印包含两个关键字的文件,第二个是 OR 运算,如果文件名包含任一字符串,则打印文件名。选择你的毒药。
答案3
或者只使用egrep:
find . -name "*.xml" -exec egrep -iH "keyword1|keyword2" {} \;