glob 匹配模式

在计算机编程领域,glob模式使用字符通配符制定了文件名的集合。比如,Unix Bash shell 命令mv *.txt textfiles/会将当前目录下所有以.txt结尾的文件移动到textfiles目录下。在这里,*就是通配符,代表“任何字符组成的字符串”,而*.txt就是glob模式。其他常用的通配符有问号?,代表单个字符。

glob命令,是global的缩写,起源于贝尔实验室的 Unix 最早期的版本。后来,这项功能以库函数glob()的形式提供,被用于shell等程序。

语法

最常用的通配符是*?[...]

通配符描述示例匹配不匹配
*匹配任意数量的字符,包括空字符串Law*
*Law*
LawLaws,或Lawyer
LawGrokLaw,或Lawyer
GrokLawLaaw
La,或aw
?匹配任何单个字符?atCatcatBatbatat
[abc]匹配中括号里的任意单个字符[CB]atCatBatcatbat
[a-z]匹配中括号里的字符范围里的单个字符Letter[0-9]Letter0Letter1Letter2,...,Letter9LettersLetterLetter10

上述所有情况里,路径分隔符(Unix 里是/,Windows 里是/)被不会被匹配。

Unix

在 Linux 和 POSIX 系统里,*?与上述定义一样,但[...]有两个额外的含义:

通配符描述示例匹配不匹配
[!abc]匹配不在中括号里的任意单个字符[!C]atbatBatcatCat
[!a-z]匹配不在中括号字符范围里的单个字符Letter[!3-5]Letter1Letter2Letter6,...,Letter9LetterxLetter3Letter4Letterxx

一些shell比如C shellBash支持额外的语法,比如Brace expansionopen in new window

Bash shell还支持Extended Globbing,允许其他模式匹配操作符被用于匹配多个被圆括号(())包裹的模式,这可以通过设置extglob的选项来启用。

文件/文件夹匹配

在命令行里经常会使用***来匹配文件和文件夹,一些常用的方式为:

  • *: 在单个路径部分里,匹配 0 或多个字符
  • **: 若是**独自存在在路径的某个部分,则它将匹配 0 或多个目录以及子目录。

示例:

  • a/*.js: 匹配a/b.jsa/bc.jsa/bcd.js等等
  • **/*.js: 配置根目录下所有文件夹及其子文件里的.js文件
  • *.js: 在设置了matchBase:true时,等同于**/*.js

详见: github - node-globopen in new window