使用“**”模式匹配部分文件名

时间:2017-09-22 20:46:53

标签: bash file directory glob

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

我想知道**是否应该匹配 文件目录或完整文件名。我们将非常感谢您提供更精确文档的链接。

2 个答案:

答案 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将不匹配。

所以**必须是路径部分中的唯一内容。