logo科技微讯

理解 glob-patterns

作者:科技微讯
日期:2022-11-02
📝 笔记

Malik Browne维基百科

glob 起源

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

如果你看不懂这段话,可以看下面这个例子:

glob-example

上图显示在桌面有一个 tt 文件夹,通过 ls 列出了这个文件夹的所有文件,可以看到有 png、js、md 等多种类型的文件。如果我希望仅列出所有 .md 后缀的文件,只需执行 ls *.md。这时候 ls *.md 会被传递到 /etc/glob 程序,glob 就会把 * 解释为 markdownreadme,从而获得了一个参数列表 [markdown.md, readme.md],把这个参数列表重新传入 ls 去执行,于是就执行了:ls markdown.mdls readme.md

现在的 glob 主要用来匹配文件名,使用相当广泛,例如 redis 用它匹配 key,jest 的 testMatch 用它匹配文件。

glob 语法

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

donation赞赏
thumbsup0
thumbsdown0
暂无评论