解释:

解释:

听起来我在问同样的事情这个问题,但我有不同的要求。这是我的文件系统的示例:

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

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

$ grep -r "some string" /code/internal/dev/
$ grep -r "some string" /code/public/dev/
$ grep -r "some string" /code/tools/

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

答案1

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

grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/

答案2

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

grep -r "some string" /code/{*/dev,tools}/*.cs

解释:

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

echo A{1,2,3,4}B

哪个输出

A1B A2B A3B A4B

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

echo {,1,2}{0,1,2}:{2,3}

给出

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

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

grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs

下一步是通配符扩展。您已经知道这*.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

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

相关内容