有没有更简单的方法来 grep 目录下的所有文件?

有没有更简单的方法来 grep 目录下的所有文件?

当我想在整个树中搜索某些内容时,我使用

find . -type f -print0 | xargs -0 grep <search_string>

就性能或简洁性而言,是否有更好的方法来做到这一点?

答案1

检查您是否grep支持-r选项(例如递归):

grep -r <search_string> .

答案2

如果您想递归到子目录:

grep -R 'pattern' .

-R选项不是标准选项,但大多数常见grep实现都支持。

答案3

次优答案:您可以运行而不是通过管道输入findinto的输出grep

find . -type f -exec grep 'research' {} '+'

瞧,一个命令而不是两个!

解释 :

find . -type f

查找 中的所有常规文件。

-exec grep 'research'

grep '研究'

{}

在找到的文件名中

'+'

对所有文件名使用一个命令,而不是对每个文件名使用一次。

Nb :';'每个文件名都会出现一次。

除此之外,如果您使用它来处理源代码,您可以查看ack,它是为了轻松查找代码位而设计的。

确认

编辑 :

你可以稍微扩展一下这项研究。首先,您可以使用-name ''的 开关find来查找具有指定命名模式的文件。

例如 :

  • 仅对应于日志的文件:-name '*.log'

  • 仅对应于 c 标头的文件,但文件扩展名不能坚持使用大写或小写:-iname *.c

Nb :与grepand一样ack-i开关在这种情况下表示不区分大小写。

在这种情况下,grep 将显示不带颜色和行号的内容。

您可以使用--color-n开关(分别是文件中的颜色和行号)来更改它。

最后,你可以得到类似的东西:

find . -name '*.log' -type f -exec grep --color -n 'pattern' {} '+'

例如

$ find . -name '*.c' -type f -exec grep -n 'hello' {} '+' 
./test2/target.c:1:hello

答案4

如果您正在处理大量文件,则如果您修剪需要搜索的文件而不是 grep 子文件夹中的所有文件,则 grep 运行速度会更快。

我有时使用这种格式:

grep "primary" `find . | grep cpp$`

.查找以 .txt 结尾的子文件夹中的所有文件cpp。然后 grep 这些文件查找“primary”。

如果需要,您可以继续将这些结果传递到进一步的 grep 调用中:

grep "primary" `find . | grep cpp$` | grep -v "ignoreThis" | grep -i "caseInsensitiveGrep"

相关内容