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 语句的效果。