我不得不多次这样做,通常是在尝试查找在哪些文件中使用了变量或函数时。
我记得过去使用 xargs 和 grep 来做到这一点,但我想知道是否有更简单的方法。
grep -r REGEX .
替换.
为您要从中搜索的任何目录。
这样做的便携式方法*是
find . -type f -print0 | xargs -0 grep pattern
-print0
告诉 find 使用 ASCII nuls 作为分隔符并-0
告诉 xargs 同样的事情。如果您不使用它们,您将在名称中包含空格的文件和目录上遇到错误。
* 与 grep -r、grep -R 或 grep --recursive 相对,后者仅适用于某些机器。
这是我开始使用ack ( http://petdance.com/ack/ ) 代替grep的情况之一。从该站点,您可以获得将其安装为 Perl CPAN 组件的说明,或者您可以获得无需处理依赖关系即可安装的独立版本。
除了默认为递归搜索这一事实外,它还允许您使用 Perl 强度的正则表达式、使用正则表达式来选择要搜索的文件等。它有一个令人印象深刻的选项列表。我建议访问该网站并检查一下。我发现它非常易于使用,如果您使用它,还有一些技巧可以将它与 vi(m)、emacs 甚至 TextMate 集成。
如果您正在寻找字符串匹配,请使用
fgrep -r pattern .
这比使用 grep 更快。更多关于这里的主题:http ://www.mkssoftware.com/docs/man1/grep.1.asp
grep -r 如果您使用的是大多数 Linux 发行版附带的 GNU grep。
在大多数 UNIX 上,默认情况下没有安装它,所以试试这个:
寻找 。-类型 f | xargs grep 正则表达式
如果您使用 zsh shell,您可以使用
grep REGEX **/*
或者
grep REGEX **/*.java
如果匹配的文件太多,这可能会失去动力。
不过,规范的方法是将 find 与 exec 一起使用。
find . -name '*.java' -exec grep REGEX {} \;
或者
find . -type f -exec grep REGEX {} \;
'type f' 位仅表示文件类型,将匹配所有文件。
我建议将答案更改为:
grep REGEX -r .
-r 开关不表示正则表达式。它告诉 grep 递归到提供的目录。
这是使用一种或多种文件类型递归查找精确表达式的好方法:
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'