Command line 搜索字符串:查找和Grep

Command line 搜索字符串:查找和Grep,command-line,find,grep,Command Line,Find,Grep,必须有更好/更短的方法来实现这一点: # Find files that contain <string-to-find> in current directory # (including sub directories) $ find . | xargs grep <string-to-find> #查找当前目录中包含的文件 #(包括子目录) $find.|沙尔格斯格雷普 此外,要仅搜索HTML文件,请执行以下操作: # find . | grep htm

必须有更好/更短的方法来实现这一点:

# Find files that contain <string-to-find> in current directory
#   (including sub directories) 
$ find . | xargs grep <string-to-find>
#查找当前目录中包含的文件
#(包括子目录)
$find.|沙尔格斯格雷普
此外,要仅搜索HTML文件,请执行以下操作:

 # find . | grep html$ | xargs grep <string-to-find>
#查找。|grep html$| xargs grep
事先谢谢

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以查找filename
,从而避免了参数列表过长的可能性,以及
find
在将结果传递给
xargs
之前需要完成执行


请举例说明:

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


很确定这是唯一的办法。您必须重新减额每个文件夹,然后再减额每个子文件夹并检查每个文件。

我能想到的另一件事是,在服务器代码中,将目录和文件结构放入LINQ查询,然后可以对其执行类似sql的查询。但是服务器最终会做几乎相同的事情。

不确定“更好”是什么意思,我的第一个想法是这样的:

grep <string-to-find> $(find -regex .*\.html)
grep$(find-regex.\.html)
但更糟糕的是,这个发现的结果会累积到shell内存中的某个地方,然后作为一大块输入参数发送

我也认为你的建议唯一重要的是

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

这样,“查找”将执行所有过滤,并且您仍然保留管道处理功能。如果这将是您将要使用的常用搜索实用程序,您可能需要查看一下,它将“查找”和“grep组合到您要查找的功能中。与
grep
相比,它的功能更少,尽管99%的搜索都非常适合使用
ack
替换
grep
的所有实例

除了给出的其他答案外,我还建议以下构造:

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

找到-键入f-name“*.html”-print0 | xargs-0-I FILENAME grep“”FILENAME
这里--^和--^
这样地:

找到-键入f-name“*.html”-print0 | xargs-0-I GRRRR grep“”GRRR
这个--^--^


它本质上与
find
语句中使用的
{}
做了相同的事情,以声明“返回的文本行”。否则,xargs只会将
find
的结果添加到您所给出的所有其他命令的末尾(如果您希望
grep
在文件中搜索,这通常是在命令行的最后指定的,那么这没有多大帮助)。

不确定您所说的更好是什么意思?我在想象,也许我们可以只使用一个命令;如果文件列表太长,则使用
xargs
将所有文件名传递给
grep
将不起作用。@Radu:谢谢您指出这一点。是否在某处记录了该限制?@Siku-Siku.Com,您可以在Linux内核中找到它的定义为
ARG_MAX
,它的默认值为
131072
。您是否愿意在命令末尾解释“{}”构造?如果您没有使用外来的东西,xargs不应该等待find完成。现代操作系统在find输出数据并由xargs处理时通过管道传输数据,在find完成之前,没有一个缓冲区被填满(MSDOS中的管道就是这样工作的)。要测试这一点,只需转到/并执行find,记下find完成所需的时间(如果感到无聊,可以中断它)。然后运行find/| xargs您可以很容易地看到xargs从find输出数据。@Siku-Siku.Com,
find
用当前文件名替换
{}
。@Ivan,即使
xargs
find
输出数据后立即接收数据,它也无法运行该命令,直到它有了所有参数。为此,
find
必须完成发送。
find . -name \*.html -exec grep -H string-to-find {} \;
grep <string-to-find> $(find -regex .*\.html)
find -regex .*\.html | xargs grep <string-to-find>
find . -type f -name "*.html" -print|xargs -I FILENAME grep "< string-to-find>" 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 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 --^