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


21

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

  • /码/
    • 内部/
      • 开发/
      • 主要/
    • 上市/
      • 开发/
      • 主要/
      • 发布/
    • 工具/

/code/internal/dev//code/public/dev//code/tools/包含多个项目的子目录。我在dev的分支机构几乎全部工作/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脚本。

Answers:


38

您可以串联grep查找的几个路径:

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

这是如此明显。我为什么没想到这个?
David Kennedy

实际上,grep: /code/internal/dev/*.cs: No such file or directory除非我*.cs从命令中删除,否则这将引发错误。这是我的错,因为我*.cs最初是在提出问题。
大卫·肯尼迪

14

如果要最大程度地使用通配符(并且您发布的层次结构已完成),则可以执行

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,但它也适用于中间目录。此外,如果/遵循,则仅匹配目录。因此,根据您的层次结构(并为.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)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.