跳到主要内容

glob 通配符全套语法实测,看清一条模式到底匹配哪些路径

glob 通配符的 * ? ** [] {} 各管一件事,弄混就会让 .gitignore 漏掉文件,或让 CI 跑多余的任务。这篇带你逐个语法实测,看哪些路径命中、哪些落空,顺带讲清和正则的区别。

发布于 作者 李雷
#glob #通配符 #gitignore #正则 #前端工具

glob 通配符全套语法实测,看清一条模式到底匹配哪些路径

.gitignore、配 Vite 的 include、调 CI 的路径过滤,绕不开 glob 通配符。问题是 glob 的几个符号长得很像,管的事却各不相同,一旦弄混,要么该忽略的文件没被忽略,要么不该跑的 CI 任务白跑一遍。这篇把 *?**[]{} 逐个拆开,配上真实路径看哪些命中、哪些落空,你可以一边读一边在 /zh/t/glob-pattern-tester/ 里把每个例子贴进去验证。

单星只待在一层目录里

单星 * 匹配一层路径段里的任意字符,但遇到斜杠就停。所以 src/*.ts 匹配 src/index.ts,却跳过 src/utils/date.ts,因为后者多了一层 utils/,斜杠把单星挡住了。

这是最容易踩的坑。很多人以为 src/*.ts 把 src 下所有 ts 文件全包了,实际只覆盖直接放在 src 里的那几个,深一层就漏。

双星跨任意层级目录

需要跨目录就换双星 **。它能穿过斜杠,落到任意深度。

举个真实例子,把 src/**/*.ts 贴进测试器,再贴一组路径:

  • src/index.ts,匹配(零层额外目录)
  • src/utils/date.ts,匹配(一层)
  • src/a/b/c.ts,匹配(两层)
  • lib/a.ts,不匹配,因为根被固定成了 src

src/**/*.ts 从左往右读就是:src/ 锁住根目录,** 表示零层或多层目录,*.ts 是落到哪个目录后任意一个以 .ts 结尾的文件。三者拼起来,src 下不管嵌套多深的 ts 文件都能命中,但出了 src 的目录一律落空。

要注意双星得独占一段。写成 src/**.ts 不会按你期望的方式跨目录,跨目录的写法是 src/**/*.ts,双星和文件模式之间隔着一个斜杠。

问号、方括号、大括号管的是字符级别

问号 ? 恰好匹配一个字符,和单星一样不跨斜杠。file?.txt 匹配 file1.txtfileA.txt,但不匹配 file.txt(零个字符)和 file12.txt(两个字符)。

方括号 [] 是字符类,匹配集合或区间里的一个字符。file[a-z].txt 匹配 filea.txt 而不匹配 file1.txt。开头加叹号就取反,v[!0-9].txt 接受 va.txt 但拒绝 v9.txt

大括号 {} 是或选组。app.{js,ts} 匹配 app.jsapp.ts,等同于写两条模式。选项里也能放通配符,src/{*.js,*.ts} 一次命中 src 下的 js 和 ts 文件,在构建配置里想一次覆盖多个扩展名时,这是最干净的写法。

glob 不是正则,别拿正则的脑子套

这两套语法看着像,规则差很多。glob 里的点就是字面的点,加号就是字面的加号,也没有 ^$ 这种锚定。*.txt 表示字面的 .txt 扩展名,而不是任意字符再加 txt。

我自己排查 .gitignore 漏掉文件的问题时,最有用的恰恰是测试器里那块等价正则面板:输入 **/*.ts,它会把双星编译成 (?:.*/)? 这样的形式,看到目录前缀是可选的,就立刻明白为什么 index.ts 在零层目录下也能匹配。把 glob 编译成正则摆在眼前,比对着文档猜半天靠谱得多。想单独打磨正则的人,可以接着用 /zh/t/regex-tester/ 把那段正则拆开验。

真实场景:这些地方都在跑 glob

glob 驱动着 .gitignore.dockerignore(dist/***.log)、构建工具的 include 与 exclude 列表(Vite、Webpack、ESLint、Prettier)、决定哪些 CI 任务运行的路径过滤,以及 shell 展开。

一个常见的翻车场景:你给 .gitignore 加了 dist/**,但 build/dist/x.js 还是出现在 git status 里。把 dist/** 当模式、把这几条真实路径贴进测试器,会发现 build/dist/x.js 没被匹配,因为规则锚在了根目录,改成 **/dist/** 再确认一遍,问题就在提交前解决,而不是提交后才发现。想直接生成一份规范的忽略规则,可以配合 /zh/t/gitignore-generator/ 一起用。

搞清 dist/** 还是 **/dist 能匹配某条路径,能省下不少构建翻车。与其对着配置文件猜,不如把模式和路径贴进测试器,实时看哪一行命中、哪一行落空,确认无误再提交。


Made by Toolora · Updated 2026-06-13