如何使用 grep 搜索多个未嵌套的目录?

Big*_*uge 32 grep search

听起来我和这个问题问的是同一件事,但我有不同的要求。这是我的文件系统的一个例子:

  • /代码/
    • 内部的/
      • 开发/
      • 主要的/
    • 民众/
      • 开发/
      • 主要的/
      • 释放/
    • 工具/

/code/internal/dev//code/public/dev//code/tools/包含多个项目的子目录。我几乎只在/code/internal/and的 dev 分支中工作/code/public/,并且通常我想在这些目录中搜索文本字符串 with /code/tools/(没有分支)。在这些情况下,我必须执行三个单独的命令:

$ grep -r "some string" /code/internal/dev/
$ grep -r "some string" /code/public/dev/
$ grep -r "some string" /code/tools/
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一个命令可以做到这一点。如果没有,我很可能需要编写一个简单的 bash 脚本。

小智 49

您可以连接多个路径以供 grep 查找:

grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/
Run Code Online (Sandbox Code Playgroud)

  • 这太明显了。我怎么没想到这一点?! (3认同)

cel*_*chk 17

如果你想最大限度地使用通配符(并且你发布的层次结构是完整的),你可以这样做

grep -r "some string" /code/{*/dev,tools}/*.cs
Run Code Online (Sandbox Code Playgroud)

解释:

完成的第一步是扩展括号列表。foo{bar,baz}qux扩展到foobarqux foobazqux. 也就是说,为列表中的每个逗号分隔项生成一个单独的词,每个词都附加前缀和后缀部分。你可以通过这样做来了解它是如何工作的

echo A{1,2,3,4}B
Run Code Online (Sandbox Code Playgroud)

哪个输出

A1B A2B A3B A4B
Run Code Online (Sandbox Code Playgroud)

请注意,这也适用于多个大括号,也适用于空参数;例如

echo {,1,2}{0,1,2}:{2,3}
Run Code Online (Sandbox Code Playgroud)

0:2 0:3 1:2 1:3 2:2 2:3 10:2 10:3 11:2 11:3 12:2 12:3 20:2 20:3 21:2 21:3 22:2 22:3
Run Code Online (Sandbox Code Playgroud)

因此,在大括号扩展之后,您的命令如下所示:

grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs
Run Code Online (Sandbox Code Playgroud)

下一步是通配符扩展。您已经知道这一点*.cs,但它也适用于中间目录;此外,如果 a/跟随,则仅匹配目录。因此,鉴于您的层次结构(并为.cs文件组成文件名),您将获得以下命令:

grep -r "some string" /code/internal/dev/file1.cs /code/internal/dev/file2.cs /code/public/dev/file3.cs /code/tools/file4.cs /code/tools/file5.cs
Run Code Online (Sandbox Code Playgroud)

只有在这一切发生之后,grep才会使用此参数列表调用(请注意,原始命令也会发生同样的情况;grep永远不会看到*;bash在调用之前完全完成的扩展grep)。