1.简介
在计算机编程中,Glob Pattern 是通配符匹配模式,它利用通配符来匹配一组文件或目录。
注意,Glob Pattern 不是一个统一的标准,而是一个在不同系统和工具中常见的模式匹配方式。虽然它们的基本概念相似,但具体实现和支持的特性可能会有所不同。
本文将介绍常见的通配符模式。
2.glob 是什么意思?
在“glob pattern”中,“glob” 是一个术语,用于描述一种文件名匹配的技术。这个术语最早来源于 Unix 系统,是 “global” 的缩写。
最初在 Unix 系统中,“glob” 是一个用于扩展通配符的命令。这个命令会读取包含通配符的模式,然后将其扩展为符合该模式的所有文件名列表。
glob 用于简化对一组文件或目录的操作。例如,你可以使用 *.txt 来匹配所有以 .txt 结尾的文件,而不需要一个一个地指定文件名。
现在,“glob” 已经成为许多操作系统、编程语言和工具中的标准术语,用来指代这种通配符模式匹配的方法。
3.通配符
如果字符串包含以下字符之一,则可以将其视为通配符模式 *
, ?
或 [...]
。
星号 *
匹配零个或多个字符。
例如 *.txt
匹配所有以 .txt 结尾的文件,如 file1.txt 和 document.txt。
data/*
匹配 data 目录下的所有文件和子目录。
问号 ?
匹配一个单一字符。
例如 file?.txt 匹配 file1.txt、fileA.txt,但不匹配 file.txt。
方括号 []
匹配方括号内的任意一个字符。
例如 file[123].txt 匹配 file1.txt、file2.txt 和 file3.txt。
方括号 [] 还可以指定字符的范围,它由两个字符表示,用破折号“-”分隔。
例如,模式[A-C]
将匹配任何包含 ABC 的起始字符。
范围可以相互结合使用,形成强大的模式。您以前可能见过的一个常见模式是匹配字母数字字符串的模式:[A-za-z0-9]
这将匹配以下内容:
- [A-Z] A到Z都是大写字母
- [a-z] a到z都是小写字母
- [0-9] 0到9之间的所有数字
这可以用于不同领域的字符串匹配,因为范围也可以在正则表达式中工作。
大括号 {}
匹配大括号内的任意一个模式,使用逗号分隔。
例如 file{1,2,3}.txt 匹配 file1.txt、file2.txt 和 file3.txt。
4.关于双星号 **
在通配符模式中,**
(双星号)通常用于表示递归匹配多个目录层级的模式。这意味着它可以匹配任意深度的子目录。
双星号是对传统通配符模式的一个扩展,不同的工具和语言对 **
的支持可能略有不同,但基本原理是类似的。
- 在 Unix/Linux Shells 中
在传统的 Unix/Linux shell 中,如 Bash,**
通常不是默认支持的模式。但在某些 shell 中(如 Zsh)可以使用 ** 进行递归匹配。
例如,在 Zsh 中,**/*.txt 可以匹配当前目录及其所有子目录中的所有 .txt 文件。
- 在 Node.js 的 glob 模块中
**
用于递归地匹配任意数量的子目录。例如,src/**/*.js
匹配 src 目录及其所有子目录中的所有 .js 文件。
示例:
代码语言:javascript复制const glob = require('glob');
glob('src/**/*.js', (err, files) => {
console.log(files);
});
- 在构建工具中
在许多构建工具和任务运行器中,**
用于递归匹配目录中的文件。例如,gulp、webpack 等工具中的配置文件中可以使用 **
来匹配目录中的文件。
示例(Gulp):
代码语言:javascript复制gulp.src('src/**/*.js')
.pipe(/* your processing here */);
5.反转
值得一提的一个特性是,globs 可以与改变模式工作方式的特殊字符一起使用。
这两个特殊字符是:
- 感叹号 (!)
- 反斜杠 ()
感叹号可以否定它前面的模式。在我上面分享的字符类示例中,我们使用了模式[123]
。
如果我们想要显式地过滤我们想要的结果,我们可以通过[!123]
来否定该模式。
反斜杠用于删除通配符的特殊含义,以便它们可以在模式中使用。
6.小结
Glob Patterns 常用于脚本、命令行工具、构建系统(如 make)、以及许多编程语言中的文件操作库(如 Python 的 glob 模块),我们需要熟练掌握和使用。
参考文献
glob (programming) - wikipedia A Beginner’s Guide: Glob Patterns