代码之家  ›  专栏  ›  技术社区  ›  rnso

为什么grep不递归

  •  1
  • rnso  · 技术社区  · 6 年前

    我有一个名为的目录 0-golang 子文件夹中 .go 文件有“更近”的文本。但是 grep 命令 -r -R -d recurse 没有找到这些:

    0-golang$ grep -r "closer" *.go 
    0-golang$ grep -R "closer" *.go 
    0-golang$ grep -d recurse "closer" *.go 
    

    上面的命令不产生输出。但遵循命令使用 find , xargs 格雷普 显示这些字符串:

    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脚本文件中。

    2 回复  |  直到 6 年前
        1
  •  7
  •   axiac    6 年前

    麻烦制造者是 *.go 命令行末尾的glob。外壳膨胀了 *去 到的列表 .go 当前目录中的文件,并将更新的命令行传递给 grep . 递归搜索的请求对 格雷普 在这种情况下,它会忽略它。

    要解决这个问题,你必须说 格雷普 递归搜索( -r )在当前目录中( . )只检查与 *去 图案( --include )

    完整的命令行是:

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

    关于 *去 模式是防止外壳扩展模式所必需的。否则,你最终会遇到和以前类似的情况。周围的引言 closer 仅当要搜索的文本( closed 在本例中)包含外壳所特有的空格或字符。

        2
  •  4
  •   tripleee    6 年前

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

    GNU grep 允许控制递归时要检查的文件模式 --include 但是文件名参数应该是 . 检查当前目录 -R ,它的子目录)。

    你的 find 尝试可以简化和改进(精度更高,更正确);

    find . -type f -name '*.go' -exec grep 'closer' /dev/null {} +
    

    引号阻止了shell的扩展 *去 在这里。添加 /dev/null 作为一个论点 格雷普 是一个常见的黑客来确保 格雷普 始终接收多个文件名(它隐式地启用 -H 以及其他一些好的违约)。