glob 是 global 的简称,起源于 1969 年某个版本的 unix 系统,这个系统有一个位于 /etc/glob 的程序。这个程序的作用是:如果一个 shell 命令中带有 * 或 ? 这两个字符,就把这个命令传递给 /etc/glob 程序,glob 会对 * 或 ? 这两个特殊字符进行解释,从而为这个 shell 命令扩展出一个参数列表,最后把这个参数列表传入这个 shell 命令进行执行。
如果你看不懂这段话,可以看下面这个例子:

上图显示在桌面有一个 tt 文件夹,通过 ls 列出了这个文件夹的所有文件,可以看到有 png、js、md 等多种类型的文件。如果我希望仅列出所有 .md 后缀的文件,只需执行 ls *.md。这时候 ls *.md 会被传递到 /etc/glob 程序,glob 就会把 * 解释为 markdown、readme,从而获得了一个参数列表 [markdown.md, readme.md],把这个参数列表重新传入 ls 去执行,于是就执行了:ls markdown.md、ls readme.md。
现在的 glob 主要用来匹配文件名,使用相当广泛,例如 redis 用它匹配 key,jest 的 testMatch 用它匹配文件。
glob 的语法主要涉及以下 3 个通配符:
*:匹配任意数量的任意字符,注意正则中的 * 是匹配同一个字符的任意数量,例如正则的 a* 表示 0 个或多个 a,正则的 .* 才表示 0 个或多个任意字符串;?:匹配任意 1 个字符,等同于正则的 .;[]:有两种写法:
[abc]:表示匹配 a、b、c 中的任意 1 个字符;[a-z]:表示匹配从 a 到 z 中的任意 1 个字符;以下 3 个字符不是通配符,但在 glob 中也有特殊含义:
\:表示取消通配符的特殊含义,例如 \* 匹配 * 这个字符,这里的 * 不再用作通配符;!:只能用在 [] 中,表示反转的意思,例如 [!abc] 表示匹配任意不是 a、b、c 的 1 个字符;-:用在 [] 中表示范围,例如 [a-z];有一个叫 glob tool 的在线 glob 测试工具,可以让你实时测试你写的 glob 语句的效果。