2014-03-28 58 views
1

我想在任何名为search-this-one.html的文件中搜索字符串“my-search-string”如何使用ack(最好是ack)或grep在文件列表中搜索字符串?

在我当前工作目录的所有子目录中。

我想要一个包含此字符串的文件的完整路径列表。有数百个名为search-this-one.html的文件,其中任何一个都可以包含该字符串。

有没有人有过这样的成功。

我能得到的文件列表这样的..

find . -type f -name "search-this-one.html" 

我已经试过了各种关于这个grep和ACK开关,所有其他相关的答案,只搜索匹配搜索字符串的文件名。

回答

2

如果你正在运行的ACK 2.x中,您可以使用-x选项从STDIN获取输入,就像xargs的。

ack -g search-this-one.html | ack -x pattern 

ack -g表示“找到匹配search-this-one.html名称的任何文本文件”,然后多数民众赞成管道输送到ack -x这需要从标准输入它的输入文件列表。

也适用于与正则表达式搜索文件名:

ack -g '\.*.conf$' | ack -x searchString 
+0

这是一个非常快速的解决方案。荣誉:) – chim

2

find命令添加-exec

find . -type f -name "search-this-one.html" -exec grep "my-search-string" {} \; 

这样find将输出将在其上执行命令grep "my_search_string"文件名列表。

要获得文件,并在发生这种情况的出现,加上-Hgrep

find . -type f -name "search-this-one.html" -exec grep -H "my-search-string" {} \; 
+0

这将搜索文件名。 – PlasmaPower

+0

不,这将搜索这些文件,并在其中搜索'grep'来检查'my_search_string'是否存在。 – fedorqui

+0

是的,它会的,我忘了你可以通过文件名grep,我几乎从来没有使用该功能。 +1使用'-exec'而不是'xargs'。 – PlasmaPower

3

你可以使用xargs

find . -type f -name "search-this-one.html" | xargs grep "my-search-string" 

通过附加-l开关grep,你会得到没有完全匹配位置的匹配文件列表。

+0

感谢您的时间Jasper – chim

2

不管它的价值,我从来没有发现一个简洁的方式来做到这一点使用ack,但以下工作:

ack --type-add foo:is:search-this-one.html --foo my-search-string 

说明:

  • --type-add foo:is:search-this-one.html:这增加了(在这一个命令期间)一种新类型foo,定义为所有文件的名称issearch-this-one.html
  • --foo:只搜索类型foo

同样的文件,进一步@fedorqui等人,可以改用-exec cmd {} +选项来查找,运行它这使所有的文件名匹配到命令之前,避开需要对-H标志:

find . -name search-this-one.html -type f -exec grep "my-search-string" {} + 
+1

为ack解决方案+1,我相信我会尽快再次这样做,所以会尝试这种方法。我尝试使用-x开关来传递文件的lsit,并且一次只传递一个文件,但它没有找到所有带有搜索字符串的文件。 – chim

+0

@chim哪个'-x'开关? – sanmiguel

+0

http://beyondgrep.com/documentation/下的文件查找部分 – chim