答案1
你可以试试
grep -r --include=*.php "search string" /path/to/dir
答案2
我建议你使用类似标签而不是使用 grep。但是,如果你愿意,你可以这样做
find <top level dir> -name \*.php | xargs grep "class MyClass"
class
当然,这是假设和之间只有一个空格,myClass
但这可能不是事实。不过,很容易更改正则表达式以查找任意数量的空格。
答案3
如果你使用-r
,你可能只想递归搜索当前目录:
grep -r 'class MyClass' .
请注意上面末尾的句号。
你所说的grep
是,你希望它递归搜索每个*.php
文件或目录,但您可能没有任何以 .php 扩展名结尾的目录。以上是进行搜索的最简单的方法,但也包括其他类型的文件,这在您到处都有 .svn 目录时尤其成问题。如果您没有很多其他文件类型,则上述方法通常就足够了,并且效果很好。
大多数 grep 版本都没有办法指定可以搜索的文件扩展名,因此通常将 find 与它结合使用:
find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} \;
-iname
告诉某些版本的 grep 您想要执行不区分大小写的文件名搜索,但许多非 GNU 版本的 find 不支持它,因此您可以改用-name
。
上述-exec
选项的副作用是针对每个文件调用 grep,这是相当昂贵的。
还有其他版本的 grep 支持 a,+
它告诉 find 将参数附加在一起以减少可执行文件的调用次数:
find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} + \;
经常推荐的减少调用的方法是使用 xargs,它将尽可能少地触发 grep,但会根据需要多次触发:
find <startDir> -iname \*.php | xargs grep "class[ \t]*MyClass"
xargs
足够智能,可以将 grep 传递给命令行支持的最大参数数量,但上述变体不能很好地处理某些字符,如空格。例如,如果文件名为“the file.php”,则 grep 将接收“the”作为参数,并将“file.php”作为参数,因此不会同时找到这两个参数。相反,我们使用:
find <startDir> -iname \*.php -print0 | xargs -0 grep "class[ \t]*MyClass"
print0
并-0
一起工作并使用后跟空字符的参数,以便完整且明确地识别参数。
如果在 或制表符后有多个空格class
,则可能需要通过更改正则表达式来允许更多字符:class[ \t]*MyClass
这个帖子StackOverflow 上有其他示例,并演示了如何排除某些目录,例如 .svn 目录。
答案4
grep -r 'class MyClass' *.php
将搜索所有名称以 .php 结尾的文件夹
grep -r 'class MyClass' . | grep .php
将在所有子文件夹中的所有文件中搜索类 MyClass,然后仅返回其中包含 .php 的文件。