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 --^