如何结合find
和以递归方式从名为 /home/smith/source 的目录开始在所有 *.html 和 *.php 文件中grep
搜索str1
或str2
?输出只需要列出文件(带路径),而不是实际匹配的字符串。我尝试了很多种方法,但都没有成功。有很多示例说明如何针对一个文件模式或一个字符串执行此操作,但不是针对多个文件模式和多个字符串执行此操作--递归地。
答案1
其他的都是正确的,但我认为,有了现代版的 grep,这些方法就有点矫枉过正了。下面将以递归方式扫描扩展名为 .html 或 .php 的文件,并返回每个文件的文件名和路径,其中至少有一行与 str1 或 str2 匹配。请注意,重复选项-e
允许指定多个路径,而无需使用正则表达式语法。
grep -r --文件与匹配 --include '.html'--包括'.php'-e str1-e str2 /home/smith/source
一个工具,一个过程,无需额外分叉或扫描不相关的文件。只需要相对较新版本的 gnu grep 即可使用 --include 选项,否则您将不得不按照其他人的建议执行多阶段 grep。
答案2
egrep 'string1|string2' /home/smith/source/*.{html,php}
或者在目录内递归地查看任何类型的文件,
egrep -R 'string1|string2' /home/smith/source
您可以将其与管道中的另一个 egrep 结合起来:
egrep -R 'string1|string2' /home/smith/source | egrep '.html|.php'
答案3
使用egrep
并使用 | 来指定 str1 或 str2-:
find /home/smith/source -name \*.html -o -name \*.php -exec egrep -H 'str1|str2' {} \;
答案4
如果您使用ack
(请参阅http://beyondgrep.com) 你可以这样做:
ack --php --html -l 'str1|str2' /home/smith/source