为何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
相关产品推荐
相关产品推荐

