在LInux中search多个文件中的string

我如何search文件,其中的一些可能是目录(在这种情况下recursion)给定的string?

我想search一个类定义的源文件,所以如果在每个输出string之前有包含文件的名字,那也是很好的。

你可以使用grep:

grep -rn 'classname' /path/to/source 

这也将打印每场比赛旁边的线路号码。

不区分大小写:

 grep -rin 'classname' /path/to/source 

在所有cpp文件中非recursionsearch:

 grep -n 'classname' /path/to/source/*.cpp 

以上所有答案都可以很好地工作,但是如果你的string不仅仅是源代码,可能会导致误报。 假设您正在寻找在Java项目中使用FooBar类的地方,您可以search名为* .java的所有文件,并仅searchgrep。

 # grep "FooBar" -Hn $(find -name "*.java") 

$()之间的部分将扩展到该命令的输出。 -H打印出文件名。 这是默认情况下有多个文件名,但是我们明确地在这里添加它,以防扩展只返回一个文件名。 -n打印匹配的行号。

这将适用于小型项目,但是如果您正在处理更大的项目,则可能会将查找扩展为比命令行限制更长的string。 因此使用更安全:

 # find -name "*.java" -print0 | xargs -0 grep "FooBar" -Hn 

xargs将从标准input中进行分割并将其分解,以便它适合命令行,必要时多次运行该命令。 -print0和-0需要用名称中的空格来处理文件。

您还可以使用以下匹配查找所有文件名:

 # find -name "*.java" -print0 | xargs -0 grep "FooBar" -l 

-l将只显示文件名并在find匹配时立即停止查找特定文件。

如果你经常要做这样的事情,你可能需要看一个像ctags或exuberant标签这样的工具,这些工具可以维护你的源代码的search索引,并且可以快速回答这些问题。 vim和emacs都支持这些工具。 你也可以看看像eclipse这样的IDE,它可以很好地交叉引用。

(我知道你正在寻找一个类的定义,但是在Java中,一个类将被定义在一个与类相同的文件中,如果你正在做cpp,你可以这样做:

 # find -name "*.cpp" -o -name "*.cc" -o -name "*.h" -o -name "*.hpp" -print0 | \ xargs -0 egrep "class\s+FooBar" -Hn 

为了search源代码,我发现ack( betterthangrep.com )引用的是市场营销,比grep更好。 它的输出更容易阅读,并会自动执行很多东西,比如忽略非源代码文件:VCS目录(例如CVS和.svn),备份文件。

ack对search源代码更好,因为它已经识别了一些最stream行的文件扩展名(c,perl等)。 它和grep一样快,默认情况下忽略所有的版本控制工件。 例如,如果你想search一些模式的Perl源代码,你可以使用

 ack --perl pattern 

代替

 grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn) 
 grep -r string * 

在当前目录中的所有(非隐藏)文件和所有子目录中查找包含字符“string”的所有文件。 您可以使用通常的正则expression式来调整string。 请参阅grep info / man页面以获取更多选项。

已经回答(我认为这就是你要找的)在这个serverfault post:

使用grep和文件模式进行recursion文本search

这是我发现自己使用很多,所以我已经把两个bash函数在我的.bashrc
首先对文件名进行recursionsearch。
第二个会对文件内部的文本进行recursionsearch,返回匹配文件的文件名。

 ff () { find . -name "*$@*" -print; } fff () { find . -type f -print0 | xargs -0 grep -l $@ } 

示例用法:

 [lunix@godzilla ~/tmp]$ ff foo ./slideshow/foo ./slideshow/velocity_puppet_workshop_2009/repo/modules/foo [lunix@godzilla ~/tmp/test]$ fff commodo ./file2 [lunix@godzilla ~/tmp/test]$ ll total 16K drwxr-xr-x 2 lunix lunix 4.0K 2009-06-29 23:01 . drwxr-xr-x 4 lunix lunix 4.0K 2009-06-29 22:57 .. -rw-r--r-- 1 lunix lunix 1.3K 2009-06-29 22:59 file1 -rw-r--r-- 1 lunix lunix 1.7K 2009-06-29 23:00 file2 

这个经典的find + exec也可以得心应手:

 find /path/to/ -type f -exec grep -i 'string' {} \; 

grep -rn *它会工作!