You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Ruby的fnmatch带FNM_PATHNAME时无法匹配子目录文件?求匹配模式

GitLab CI通配符匹配问题解析

为什么foo/**无法匹配目标路径

GitLab CI使用Ruby的File.fnmatch?方法处理通配符,且启用了FNM_PATHNAME | FNM_DOTMATCH | FNM_EXTGLOB三个选项,其中**FNM_PATHNAME是核心影响因素**:

  • 该选项会将路径分隔符/视为特殊字符,限制通配符的匹配范围——*和?无法跨越/,而**仅能匹配任意数量的目录层级(即/分隔的路径段),但不会匹配路径的最终节点(文件或最底层目录)。
  • 当你使用foo/**时,它的匹配逻辑是:匹配foo/之后跟着任意层级的目录,但必须以目录层级结尾(比如foo/a/、foo/a/b/),而无法匹配foo/a(这是一个最终节点,没有后续的/)或foo/a/b这类路径。
  • 只有关闭FNM_PATHNAME时,**才会无视/,直接匹配任意字符序列,此时foo/**才能覆盖foo/a、foo/a/b这类路径。

有没有单个模式能同时匹配foo/a和foo/a/b

有,使用foo/**/*即可:

  • 在启用FNM_PATHNAME的情况下,**可以匹配零个或多个目录层级,*则匹配最终的文件/目录节点。
  • 对于foo/a:**匹配空(即foo/之后没有额外目录层级),*匹配a,满足匹配条件。
  • 对于foo/a/b:**匹配a/这个目录层级,*匹配b,同样满足匹配条件。
  • 这个模式还能覆盖更深的嵌套路径,比如foo/a/b/c等,无需同时写foo/*和foo/**/*。

内容的提问来源于stack exchange,提问作者Timmmm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:32:47