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
不包括目录,只包括当前目录中的文件(除非您有有趣的目录名)
GNUgrep
允许您在使用--include
递归时控制要检查的文件的模式,但是文件名参数应该是
,以检查当前目录(以及-r
的子目录)
您的查找
尝试可以简化和改进(更精确;更正确)
引号阻止shell扩展。
*。转到此处。将/dev/null
作为参数添加到grep
是一种常见的技巧,可以确保grep
始终接收多个文件名(这会隐式启用-H
和一些其他良好的默认值)。-r
将递归作为参数给定的任何目录,但*。go
不包括目录,只是当前目录中的文件(除非你有有趣的目录名)
GNUgrep
允许您在使用--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我的公司