任意深度的通配符

任意深度的通配符

我想使用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/*.

相关内容