听起来我在问同样的事情这个问题,但我有不同的要求。这是我的文件系统的示例:
- /代码/
- 内部的/
- 开发/
- 主要的/
- 民众/
- 开发/
- 主要的/
- 发布/
- 工具/
- 内部的/
/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
)。