为什么grep不递归

时间:2018-07-11 09:25:42

标签: linux bash grep

我有一个名为0-golang的目录,带有子文件夹,其中一些.go文件具有“更紧密”的文本。但是带有grep-r-R的{​​{1}}命令找不到这些:

-d recurse

以上命令不产生任何输出。但是以下使用0-golang$ grep -r "closer" *.go 0-golang$ grep -R "closer" *.go 0-golang$ grep -d recurse "closer" *.go findxargs的命令显示了这些字符串:

grep

为什么0-golang$ find | grep go$ | xargs -I {} grep closer {} "github.com/xlab/closer" closer.Fatalln(err) closer.Fatalln(err) closer.Fatalln("opengl: init failed:", err) closer.Bind(func() { 命令没有递归查找?我必须将此功能合并到bash脚本文件中。

2 个答案:

答案 0 :(得分:7)

麻烦制造者是命令行末尾的-H glob。 Shell将*.go扩展到当前目录中的*.go文件列表,并将更新后的命令行传递到.go。在这种情况下,递归搜索的请求对grep没有任何意义,并且将其忽略。

要解决该问题,您必须告诉grep在当前目录(grep)中进行递归搜索(-r)并仅检查与.匹配的文件模式(*.go)。

完整的命令行为:

--include

需要使用grep -r --include="*.go" "closer" . 模式周围的引号来防止shell扩展模式。否则,您将陷入与以前类似的情况。仅当要搜索的文本(在这种情况下为*.go)中包含空格或字符是外壳程序专用的字符时,才需要在closer周围加上引号。

答案 1 :(得分:4)

-r会递归作为参数指定的所有目录,但是*.go不会覆盖目录,仅覆盖当前目录中的文件(除非您有有趣的目录名)。

GNU grep使您可以控制使用--include递归时要检查的文件模式,但是文件名参数应该只是.来检查当前目录(以及{{ 1}},及其子目录)。

您的-r尝试可以得到简化和改进(精度更高;更正确);

find

引号可防止shell在此处展开​​find . -type f -name '*.go' -exec grep 'closer' /dev/null {} + 。将*.go添加为/dev/null的参数是一种常见的技巧,以确保grep总是收到多个文件名(这将隐式启用grep和一些其他好的默认值)。