听起来我和这个问题问的是同一件事,但我有不同的要求。这是我的文件系统的一个例子:
/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)
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
)。
归档时间: |
|
查看次数: |
77780 次 |
最近记录: |