32

我不得不多次这样做,通常是在尝试查找在哪些文件中使用了变量或函数时。

我记得过去使用 xargs 和 grep 来做到这一点,但我想知道是否有更简单的方法。

4

8 回答 8

40
grep -r REGEX .

替换.为您要从中搜索的任何目录。

于 2008-10-09T05:33:55.873 回答
19

这样做的便携式方法*是

find . -type f -print0 | xargs -0 grep pattern

-print0告诉 find 使用 ASCII nuls 作为分隔符并-0告诉 xargs 同样的事情。如果您不使用它们,您将在名称中包含空格的文件和目录上遇到错误。

* 与 grep -r、grep -R 或 grep --recursive 相对,后者仅适用于某些机器。

于 2009-04-08T20:41:19.630 回答
9

这是我开始使用ack ( http://petdance.com/ack/ ) 代替grep的情况之一。从该站点,您可以获得将其安装为 Perl CPAN 组件的说明,或者您可以获得无需处理依赖关系即可安装的独立版本。

除了默认为递归搜索这一事实外,它还允许您使用 Perl 强度的正则表达式、使用正则表达式来选择要搜索的文件等。它有一个令人印象深刻的选项列表。我建议访问该网站并检查一下。我发现它非常易于使用,如果您使用它,还有一些技巧可以将它与 vi(m)、emacs 甚至 TextMate 集成。

于 2008-10-09T10:36:31.427 回答
6

如果您正在寻找字符串匹配,请使用

fgrep -r pattern .

这比使用 grep 更快。更多关于这里的主题:http ://www.mkssoftware.com/docs/man1/grep.1.asp

于 2008-10-09T13:54:43.850 回答
3

grep -r 如果您使用的是大多数 Linux 发行版附带的 GNU grep。

在大多数 UNIX 上,默认情况下没有安装它,所以试试这个:

寻找 。-类型 f | xargs grep 正则表达式

于 2008-10-09T05:37:55.507 回答
3

如果您使用 zsh shell,您可以使用

grep REGEX **/*

或者

grep REGEX **/*.java

如果匹配的文件太多,这可能会失去动力。

不过,规范的方法是将 find 与 exec 一起使用。

find . -name '*.java' -exec grep REGEX {} \;

或者

find . -type f -exec grep REGEX {} \;

'type f' 位仅表示文件类型,将匹配所有文件。

于 2008-10-09T05:47:15.487 回答
2

我建议将答案更改为:

grep REGEX -r .

-r 开关不表示正则表达式。它告诉 grep 递归到提供的目录。

于 2008-10-09T13:49:42.597 回答
1

这是使用一种或多种文件类型递归查找精确表达式的好方法:

find . \\( -name '\''*.java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep (内部单引号)

在哪里

-name '\''*.<filetype>'\'' -o (这里再次单引号)

is repeated in the parenthesis ( ) for how many more filetypes you want to add to your recursive search

an alias looks like this in bash

alias fnd='find . \\( -name '\''*.java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep'

于 2013-03-29T22:19:13.123 回答