我想在任何名为search-this-one.html的文件中搜索字符串“my-search-string”
在我当前工作目录的所有子目录中。
我想要一个包含此字符串的文件的完整路径列表。有数百个文件名为search-this-one.html,其中任意数量的文件都可以包含字符串。
有没有人这样做过。
我可以得到像这样的文件列表..
find . -type f -name "search-this-one.html"
我已尝试过各种grep和ack开关,所有其他相关答案仅搜索与搜索字符串匹配的文件名。
答案 0 :(得分:3)
您可以使用xargs
:
find . -type f -name "search-this-one.html" | xargs grep "my-search-string"
通过额外的-l
切换到grep
,您将获得一个匹配文件列表,但没有完全匹配的位置。
答案 1 :(得分:2)
在-exec
命令中添加find
:
find . -type f -name "search-this-one.html" -exec grep "my-search-string" {} \;
这样find
将输出将在其上执行命令grep "my_search_string"
的文件名列表。
要获取文件以及发生这种情况的事件,请将-H
添加到grep
:
find . -type f -name "search-this-one.html" -exec grep -H "my-search-string" {} \;
答案 2 :(得分:2)
无论它有什么价值,我都没有找到简洁的方法来使用ack
执行此操作,但以下工作:
ack --type-add foo:is:search-this-one.html --foo my-search-string
说明:
--type-add foo:is:search-this-one.html
:这会添加(在此一个命令的持续时间内)新类型foo
,定义为名称为is
search-this-one.html
--foo
:仅搜索foo
此外,@ fedorqui等人可以使用-exec cmd {} +
选项查找,在运行命令之前将所有匹配的文件名放入命令中,避免需要-H
标志:
find . -name search-this-one.html -type f -exec grep "my-search-string" {} +
答案 3 :(得分:2)
如果你正在运行ack 2.x,你可以使用-x选项从STDIN获取输入,就像xargs一样。
ack -g search-this-one.html | ack -x pattern
ack -g
说"查找名称与search-this-one.html
"匹配的任何文本文件,然后将其传送到ack -x
,其中包含其列表来自STDIN的输入文件。
还适用于使用正则表达式搜索文件名:
ack -g '\.*.conf$' | ack -x searchString