我必须多次这样做,通常是在尝试查找变量或函数的文件时。
我记得过去使用xargs和grep这样做,但我想知道是否有更简单的方法。
答案 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'