搜索字符串:查找和Grep

时间:2011-11-15 15:19:30

标签: command-line find grep

必须有更好/更短的方法来做到这一点:

# Find files that contain <string-to-find> in current directory
#   (including sub directories) 
$ find . | xargs grep <string-to-find>

此外,仅搜索例如HTML文件:

 # find . | grep html$ | xargs grep <string-to-find>

事先谢谢!

4 个答案:

答案 0 :(得分:18)

find . -name \*.html

或者,如果要查找名称与正则表达式匹配的文件:

find . -regex filename-regex.\*\.html 

或者,如果要在名称与正则表达式匹配的文件中搜索正则表达式

find . -regex filename-regex.\*\.html -exec grep -H string-to-find {} \;

grep参数-H输出文件名,如果感兴趣的话。如果没有,您可以安全地删除它,只需使用grep即可。这将指示find对它找到的每个文件名执行grep string-to-find filename,从而避免参数列表太长的可能性,并且find需要在它之前完成执行将结果传递给xargs


解决您的示例:

find . | xargs grep <string-to-find>

可以替换为

find . -exec grep -H string-to-find {} \;

find . | grep html$ | xargs grep <string-to-find>

可以替换为

find . -name \*.html -exec grep -H string-to-find {} \;

答案 1 :(得分:3)

不确定你的意思是什么,我的第一个想法是这样的:

grep <string-to-find> $(find -regex .*\.html)

但是这更糟糕,因为find的结果会在shell内存中的某个地方累积,然后作为一大块输入参数发送

我看到你唯一的建议就是

find -regex .*\.html | xargs grep <string-to-find>

这样,find会执行所有过滤,你仍然保留管道处理

答案 2 :(得分:2)

如果这将成为您将要使用的常见搜索工具,您可能需要查看ack,它结合了findgrep一起进入你正在寻找的这个功能。它的功能少于grep,但99%的搜索功能完全适合将grep的所有实例替换为ack

除了给出的其他答案,我也建议这个结构:

find . -type f -name "*.html" -print|xargs -I FILENAME grep "< string-to-find>" FILENAME
更好的是,如果文件名中包含空格,您可以引用"FILENAME"或将find的空终止(而不是换行终止)结果传递给xargs,然后xargs剥离自己:
find . -type f -name "*.html" -print0|xargs -0 -I FILENAME grep "< string-to-find>" FILENAME
                             here --^ and --^

这里,名称FILENAME实际上可以是任何东西,但它需要匹配两者

find . -type f -name "*.html" -print0|xargs -0 -I FILENAME grep "< string-to-find>" FILENAME
                                           here --^                           and --^
像这样:
find . -type f -name "*.html" -print0|xargs -0 -I GRRRR grep "< string-to-find>" GRRR
                                           this --^                       this --^

它基本上与{}语句本身中使用的find做同样的事情来陈述“此返回的文本行”。否则,xargs会将find的结果添加到您给出的所有其他命令的END(如果您希望grep在文件内搜索,这通常没有用,这通常是在命令行上指定 last

答案 3 :(得分:-1)

很确定这是唯一的方法。您将不得不通过每个文件夹,然后通过每个子文件夹并检查每个文件 只有我能想到的其他事情是在服务器代码中将目录和文件结构抛入LINQ查询,然后你可以对它进行类似sql的查询。但是服务器最终会做同样的事情。