我有一个名为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
,find
和xargs
的命令显示了这些字符串:
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脚本文件中。
答案 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
和一些其他好的默认值)。