Linux 为什么grep不是递归的

Linux 为什么grep不是递归的,linux,bash,grep,Linux,Bash,Grep,我有一个名为0-golang的目录,其中有一些.go文件的子文件夹中有“closer”文本。但是带有-r或-r或-d递归的grep命令找不到这些: 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

我有一个名为
0-golang
的目录,其中有一些
.go
文件的子文件夹中有“closer”文本。但是带有
-r
-r
-d递归的
grep
命令找不到这些:

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 grep
命令不能递归查找?我必须将此函数合并到bash脚本文件中。

-r
将递归任何作为参数给定的目录,但
*。go
不包括目录,只包括当前目录中的文件(除非您有有趣的目录名)

GNU
grep
允许您在使用
--include
递归时控制要检查的文件的模式,但是文件名参数应该是
,以检查当前目录(以及
-r
的子目录)

您的
查找
尝试可以简化和改进(更精确;更正确)


引号阻止shell扩展。
*。转到此处。将
/dev/null
作为参数添加到
grep
是一种常见的技巧,可以确保
grep
始终接收多个文件名(这会隐式启用
-H
和一些其他良好的默认值)。

-r
将递归作为参数给定的任何目录,但
*。go
不包括目录,只是当前目录中的文件(除非你有有趣的目录名)

GNU
grep
允许您在使用
--include
递归时控制要检查的文件的模式,但是文件名参数应该是
,以检查当前目录(以及
-r
的子目录)

您的
查找
尝试可以简化和改进(更精确;更正确)


引号阻止shell扩展。
*。转到此处。将
/dev/null
作为参数添加到
grep
是一种常见的技巧,可以确保
grep
始终接收多个文件名(这会隐式启用
-H
和一些其他良好的默认值)。

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

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

完整的命令行是:

grep -r --include="*.go" "closer" .

*.go
模式周围的引号是必需的,以防止shell扩展模式。否则,您将陷入与以前类似的情况。只有当要搜索的文本(
closed
在本例中)包含shell专用的空格或字符时,才需要
closer
周围的引号。

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

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

完整的命令行是:

grep -r --include="*.go" "closer" .

*.go
模式周围的引号是必需的,以防止shell扩展模式。否则,您将陷入与以前类似的情况。只有当要搜索的文本(
closed
在本例中)包含shell专用的空格或字符时,
closer
周围的引号才需要。

好吧,
*.go
将仅扩展到
.go
文件,而不是目录。因此,
grep
没有什么可递归的。您可以使用
globstar
grep closer**/*.go
。那么,
*.go
将只扩展到
.go
文件,而不是目录。因此,
grep
没有什么可递归的。您可以使用
globstar
grep closer**/*.go
。回答得好。我会使用
grep-hmoo{}如果要使用
查找
。(我假设您使用的是
find
,因为
grep-r
是GNU扩展)@hek2mgl
+
类似于
\
但是允许
find
来最小化外部进程的数量。我想说的是,如果您假设一个非posix GNU环境具有支持
+
find
版本,那么您可能只需要使用
grep-r
。我建议使用
grep-hmoo{}
用于posix兼容性,但我刚刚意识到
grep-H
不是posix。抱歉,nvm我的评论。这个/dev/null hack很好!:)回答得好。我会使用
grep-hmoo{}如果要使用
查找
。(我假设您使用的是
find
,因为
grep-r
是GNU扩展)@hek2mgl
+
类似于
\
但是允许
find
来最小化外部进程的数量。我想说的是,如果您假设一个非posix GNU环境具有支持
+
find
版本,那么您可能只需要使用
grep-r
。我建议使用
grep-hmoo{}
用于posix兼容性,但我刚刚意识到
grep-H
不是posix。对不起,nvm我的公司