我想使用grep
路径在目录下任意深度/path/to/dir
并且具有文件名的位置foo
。我认为任意深度的通配符是**
,并且我尝试过
grep some_pattern /path/to/dir/**/foo
但它似乎只匹配该**
部分代表单个目录深度的文件,例如
/path/to/dir/bar/foo
如何匹配目录下/path/to/dir
且具有文件名的任意深度的路径foo
?
答案1
使用 zsh。在 zshexpn(1) 手册页的“递归通配符”部分中:
'(foo/)#' 形式的路径名组件与由零个或多个与模式 foo 匹配的目录组成的路径相匹配。
作为简写,‘**/’等价于‘(*/)#’;请注意,这因此匹配当前目录以及子目录中的文件。
[...] 此表单不遵循符号链接;替代形式“***/”也可以,但在其他方面是相同的。
这也意味着**
默认情况下不包括隐藏目录(其名称以点开头)。如果您想匹配它们,请设置该GLOB_DOTS
选项或使用 D 全局限定符:
grep some_pattern /path/to/dir/**/foo(D)
使用 bash,您需要显式设置globstar
选项才能**
工作:
shopt -s globstar
答案2
除了vinc17的建议之外,您还可以使用--include
与 结合使用-r option
,例如:
grep -r --include \foo some_pattern /path/to/dir/*.