glob 匹配模式
在计算机编程领域,glob
模式使用字符通配符制定了文件名的集合。比如,Unix Bash shell 命令mv *.txt textfiles/
会将当前目录下所有以.txt
结尾的文件移动到textfiles
目录下。在这里,*
就是通配符,代表“任何字符组成的字符串”,而*.txt
就是glob
模式。其他常用的通配符有问号?
,代表单个字符。
glob
命令,是global
的缩写,起源于贝尔实验室的 Unix 最早期的版本。后来,这项功能以库函数glob()
的形式提供,被用于shell
等程序。
语法
最常用的通配符是*
、?
、[...]
。
通配符 | 描述 | 示例 | 匹配 | 不匹配 |
---|---|---|---|---|
* | 匹配任意数量的字符,包括空字符串 | Law* *Law* | Law ,Laws ,或Lawyer Law ,GrokLaw ,或Lawyer | GrokLaw ,La ,aw La ,或aw |
? | 匹配任何单个字符 | ?at | Cat ,cat ,Bat 或bat | at |
[abc] | 匹配中括号里的任意单个字符 | [CB]at | Cat 或Bat | cat 或bat |
[a-z] | 匹配中括号里的字符范围里的单个字符 | Letter[0-9] | Letter0 ,Letter1 ,Letter2 ,...,Letter9 | Letters ,Letter 或Letter10 |
上述所有情况里,路径分隔符(Unix 里是/
,Windows 里是/
)被不会被匹配。
Unix
在 Linux 和 POSIX 系统里,*
、?
与上述定义一样,但[...]
有两个额外的含义:
通配符 | 描述 | 示例 | 匹配 | 不匹配 |
---|---|---|---|---|
[!abc] | 匹配不在中括号里的任意单个字符 | [!C]at | bat 、Bat 或cat | Cat |
[!a-z] | 匹配不在中括号字符范围里的单个字符 | Letter[!3-5] | Letter1 ,Letter2 ,Letter6 ,...,Letter9 ,Letterx 等 | Letter3 ,Letter4 或Letterxx |
一些shell
比如C shell
和Bash
支持额外的语法,比如Brace expansionopen in new window。
Bash shell
还支持Extended Globbing
,允许其他模式匹配操作符被用于匹配多个被圆括号((
和)
)包裹的模式,这可以通过设置extglob
的选项来启用。
文件/文件夹匹配
在命令行里经常会使用**
和*
来匹配文件和文件夹,一些常用的方式为:
*
: 在单个路径部分里,匹配 0 或多个字符**
: 若是**
独自存在在路径的某个部分,则它将匹配 0 或多个目录以及子目录。
示例:
a/*.js
: 匹配a/b.js
、a/bc.js
、a/bcd.js
等等**/*.js
: 配置根目录下所有文件夹及其子文件里的.js
文件*.js
: 在设置了matchBase:true
时,等同于**/*.js
详见: github - node-globopen in new window