必须有更好/更短的方法来做到这一点:
# 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>
事先谢谢!
答案 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,它结合了find
和grep
一起进入你正在寻找的这个功能。它的功能少于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的查询。但是服务器最终会做同样的事情。