认识 Glob Pattern

2024-07-22 07:59:36 浏览数 (2)

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

0 人点赞