【问题标题】:Matching partial filenames with the "**" pattern使用“**”模式匹配部分文件名
【发布时间】:2017-09-22 20:46:53
【问题描述】:

globstar bash 选项的文档如下:

全球之星

如果设置,文件名扩展上下文中使用的模式“**”将匹配所有文件以及零个或多个目录和子目录。如果 该模式后跟一个“/”,只有目录和子目录 匹配。

这让我觉得给定这样的层次结构:

└── dir1
    └── dir2
        └── dir3
            └── file.txt

我可以使用**file* 之类的模式匹配此树结构中的file.txt。但它不起作用:

ls **file*
ls: cannot access '**file*': No such file or directory

这可行:

ls **/file*
dir1/dir2/dir3/file.txt

我想知道** 是否应该匹配或者一个文件的目录或一个完整的文件名。更精确的文档链接将不胜感激。

【问题讨论】:

  • @anubhava 不,启用 globstar 后,它将递归匹配所有目录
  • @thatotherguy:但这不是我在 bash 中的行为。 shopt -s globstar; mkdir adir; touch adir/afile; ls **afilels: cannot access '**afile': No such file or directory。但是,当我执行 ls **/afile 时,我会得到 adir/afile
  • @anubhava 你的评论是关于 ** 后跟 / ,它的行为确实是这样的

标签: bash file directory glob


【解决方案1】:

文档是正确的,如果有点电报的话。如果设置了 globstar 并且 ** 用作 glob 的一部分,则它出现的模式组件(组件是由 / 字符分隔的模式部分)将匹配:

  • 具有零个或多个组件的目录路径

  • 当前上下文中的文件名,如果 globstar 组件后面没有 /

请注意,**/ 将匹配当前目录(零组件的路径),即使 / 似乎不匹配任何内容。

如果你想匹配任何子目录中的*file*(递归),你可以使用**/*file*。然后**/ 将匹配所有目录和子目录(递归),并且在每个目录和子目录中都会尝试匹配*file* 作为文件名(包括目录名称)。

【讨论】:

    【解决方案2】:

    node-glob 的文档以与 Bash 相同的方式处理 ** 的扩展,似乎更准确:

    如果“globstar”(**)在路径部分中单独存在,则它会匹配零个或多个目录以及搜索匹配项的子目录。它不会抓取符号链接的目录。

    [..双星字符]以bsdglob和bash 4.3的方式支持,其中**only如果是路径部分的唯一,则具有特殊意义。也就是说,a/**/b 将匹配 a/x/y/b,但 a/**b 不会。

    所以** 必须是路径部分中唯一的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2017-10-19
      • 2018-05-15
      相关资源
      最近更新 更多