globstar
bash选项的文档为:
globstar
如果设置,文件名扩展上下文中使用的模式“**”将匹配所有文件以及零个或多个目录和子目录。如果 该模式后跟一个'/',只有目录和子目录 匹配。
这让我觉得给定了这样的层次结构:
└── dir1
└── dir2
└── dir3
└── file.txt
我可以使用file.txt
之类的模式匹配此树结构中的**file*
。但它不起作用:
ls **file*
ls: cannot access '**file*': No such file or directory
但这有效:
ls **/file*
dir1/dir2/dir3/file.txt
我想知道**
是否应该匹配 文件目录或完整文件名。我们将非常感谢您提供更精确文档的链接。
答案 0 :(得分:0)
文档是正确的,如果有点电报。如果设置了globstar并且**
被用作glob的一部分,则它所出现的模式的组件(组件是由 / 字符分隔的模式的部分)将被匹配:
包含零个或多个组件的目录路径
当前上下文中的文件名,如果globstar组件后面没有 / 。
请注意**/
将匹配当前目录(零组件的路径),即使 / 似乎与任何内容都不匹配。
如果您想在任何子目录(递归)中匹配*file*
,您将使用**/*file*
。然后**/
将匹配所有目录和子目录(递归),并且在每个目录和子目录中都会尝试将*file*
作为文件名(包括目录名称)进行匹配。
答案 1 :(得分:0)
node-glob的文档,以与Bash相同的方式处理**
的扩展,看起来更精确:
如果" globstar" (
**
)单独在路径部分中,然后它匹配零个或多个目录和子目录搜索匹配项。它不会抓取符号链接的目录。[..双星字符]以bsdglob和bash 4.3的方式支持,其中
**
仅具有特殊意义,如果它是路径部分中的唯一内容。也就是说,a/**/b
将匹配a/x/y/b
,但a/**b
将不匹配。
所以**
必须是路径部分中的唯一内容。