我正在一个包含数百个 PHP 文件的站点上搜索类声明。如何使用grep在当前文件夹和子文件夹中执行此操作?
我测试cd了文件夹,然后像
grep -r 'class MyClass' *.php
Run Code Online (Sandbox Code Playgroud)
小智 35
你可以试试
grep -r --include=*.php "search string" /path/to/dir
Run Code Online (Sandbox Code Playgroud)
我建议您使用ctags 之类的东西,而不是使用 grep。但是,如果您愿意,可以执行以下操作
find <top level dir> -name \*.php | xargs grep "class MyClass"
Run Code Online (Sandbox Code Playgroud)
这当然假设您在class和之间只有一个空格,myClass这可能不是真的。不过,更改正则表达式以查找任意数量的空格很容易。
如果您使用-r,您可能只想递归搜索当前目录:
grep -r 'class MyClass' .
Run Code Online (Sandbox Code Playgroud)
请注意上述末尾的句点。
您告诉的grep是您希望它递归搜索每个*.php文件或目录,但您可能没有任何以 .php 扩展名结尾的目录。以上是最简单的搜索方式,但也包括其他类型的文件,当您到处都有 .svn 目录时,这尤其成问题。如果您没有很多其他文件类型,以上通常就足够了并且效果很好。
grep 的大多数化身都没有指定可以搜索的文件扩展名的方法,因此您通常将 find 与它结合使用:
find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} \;
Run Code Online (Sandbox Code Playgroud)
-iname告诉某些版本的 grep 您想要进行不区分大小写的文件名搜索,但是 find 的许多非 GNU 变体不支持它,因此您可以改用它-name。
-exec上面的选项具有为每个文件调用 grep 的副作用,这是相当昂贵的。
还有其他版本的 grep 支持 a +,它告诉 find 将参数附加在一起以减少可执行文件的调用次数:
find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} + \;
Run Code Online (Sandbox Code Playgroud)
一种经常推荐的减少调用的方法是使用 xargs ,它会尽可能少地触发 grep ,但根据需要尽可能多地触发:
find <startDir> -iname \*.php | xargs grep "class[ \t]*MyClass"
Run Code Online (Sandbox Code Playgroud)
xargs足够聪明,可以将 grep 传递到命令行支持的最大参数数量,但上述变体不能很好地处理某些字符,如空格。例如,如果'the file.php' 文件名grep 将接收'the' 作为参数和'file.php' 作为参数,因此两者都不会被找到。相反,我们使用:
find <startDir> -iname \*.php -print0 | xargs -0 grep "class[ \t]*MyClass"
Run Code Online (Sandbox Code Playgroud)
print0并-0一起工作并使用后跟空字符的参数,以便完全明确地标识该参数。
如果您在class或制表符之后有多个空格,您可能希望通过更改正则表达式来允许更多字符:class[ \t]*MyClass
StackOverflow 上的这篇文章还有其他示例,并演示了如何排除某些目录,例如 .svn 目录。
| 归档时间: |
|
| 查看次数: |
57679 次 |
| 最近记录: |