如何找到文件夹中具有特定文本字符串和扩展名的所有文件?

如何找到文件夹中具有特定文本字符串和扩展名的所有文件?

我正在使用 OS X。

我需要在目录中查找具有扩展名的文件以及文件内容中某处的.php字符串。41

我尝试使用grep

grep -R 41 *.php

但这似乎只能在 CWD 中找到文件,而不能在子目录中找到文件。

我也尝试弄乱find

我无法弄清楚这一点。

我究竟做错了什么?

答案1

两者都需要。

find . -name '*.php' -type f -exec grep -q 41 {} \; -print

答案2

为了使 grep 能够递归工作,grep 的参数需要包含它需要递归的目录。

查看以下文件

shiny:t fl$ find .
.
./evenmore
./evenmore/foo.php
./evenmore/inhere.php
./evenmore/no41in.php
./foo.php
./inhere.php
./morestuff
./morestuff/foo.php
./morestuff/inhere.php
./morestuff/no41in.php
./no41in.php
./stuff
./stuff/no41in.php

这不起作用:

shiny:t fl$ grep -r 41 *.php
foo.php:41
inhere.php:41

因为路径名扩展完成后,shell 已经处理了星号,命令行现在是

shiny:t fl$ set -x
shiny:t fl$ grep -r 41 *.php
+ grep -r 41 foo.php inhere.php no41in.php
foo.php:41
inhere.php:41

在传递给 grep 的参数中没有要进入的目录。但是,这将进入所有存在的目录:

shiny:t fl$ grep -r 41 .
./evenmore/foo.php:41
./evenmore/inhere.php:41
./foo.php:41
./inhere.php:41
./morestuff/foo.php:41
./morestuff/inhere.php:41

是否也处理点目录则留给读者练习:-)

答案3

如果你使用确认你可以做ack 41 --php

ack就像grep具有内置突出显示和行号一样,它是为搜索源代码而设计的。

答案4

我设法使用

grep 41 **/*.php

并且它成功了。

相关内容