在递归中查找文件中字符串/正则表达式匹配的最佳方法是什么? (UNIX)

时间:2008-10-09 05:31:27

标签: linux unix recursion grep

我必须多次这样做,通常是在尝试查找变量或函数的文件时。

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

8 个答案:

答案 0 :(得分:26)

grep -r REGEX .

.替换为您要搜索的目录。

答案 1 :(得分:11)

执行此操作的便携式方法*是

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

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

*与grep -r,grep -R或grep --recursive相反,只能在某些机器上运行。

答案 2 :(得分:7)

这是我开始使用确认http://petdance.com/ack/)代替 grep 的案例之一。从该站点,您可以获得将其安装为Perl CPAN组件的说明,或者您可以获得可以在不处理依赖项的情况下安装的自包含版本。

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

答案 3 :(得分:5)

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

fgrep -r pattern .

比使用grep更快。 有关此主题的更多信息,请访问:http://www.mkssoftware.com/docs/man1/grep.1.asp

答案 4 :(得分:3)

grep -r如果您使用的是GNU grep,它随大多数Linux发行版一起提供。

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

找到。 -type f | xargs grep regex

答案 5 :(得分:3)

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

grep REGEX **/*

grep REGEX **/*.java

如果匹配文件太多,这可能会耗尽。

规范的方法是使用find with exec。

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

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

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

答案 6 :(得分:2)

我建议将答案改为:

grep REGEX -r .

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

答案 7 :(得分:1)

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

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

哪里

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

在括号()中重复

,以了解要为递归搜索添加多少个文件类型

别名在bash中看起来像这样

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