跳转到内容

Glob(文件名模式匹配)

在 Linux 系统中,Glob(文件名模式匹配)是一种用于匹配文件名或路径名的模式匹配机制,它通过特定的通配符来快速定位符合规则的文件或目录,广泛应用于 Shell 命令行、脚本以及相关编程场景中

Glob 起源于早期的 Unix 系统,其名称来源于 “global” 的缩写,意为“全局匹配”。它的核心功能是根据用户指定的模式(包含通配符),匹配系统中符合条件的文件名或路径,简化文件查找和操作的过程

在 Linux 中,Glob 通常由 Shell(如 Bash)解析和处理,也可以通过专门的函数库(如 C 语言的 glob.h)在程序中使用

Glob 由两部分组成:通配符和普通字符。普通字符直接匹配自身,通配符则具有特殊的匹配语义。需要注意的是,Glob 与正则表达式是不同的匹配机制,虽然符号有重叠,但语义完全不同

符号 含义
* 匹配任意长度的任意字符(包括空),也可以结合路径分隔符 / 使用
? 匹配任意单个字符(仅一个,不能多也不能少)
[...] 匹配括号内的任意一个字符,支持字符范围(通过 - 表示)和排除匹配(通过 ! 或 ^ 表示,不同 Shell 可能有差异)

* 示例说明:

  • *.txt:匹配所有以 .txt 结尾的文件(如 file.txt、doc123.txt)
  • ./subdir/*:匹配 subdir 目录下的所有文件和子目录(但不包括 subdir 的子目录中的内容)
  • */*.c:匹配一层子目录里的 .c 文件

? 示例说明:

  • file?.txt:匹配文件名是 file 后接 1 个字符、再以 .txt 结尾的文件(如 file1.txt、fileA.txt,但不匹配 file.txt 或 file12.txt)
  • ?.txt:匹配文件名是 1 个字符 + .txt 的文件(如 a.txt、1.txt)

[] 示例说明:

  • file[0-9].txt:匹配 file 后接 0-9 中任意一个数字、再以 .txt 结尾的文件(如 file0.txt、file5.txt)
  • [a-zA-Z].sh:匹配 1 个大小写字母 + .sh 的文件(如 A.sh、b.sh)
  • file[!0-9].txt(或 file[^0-9].txt):匹配 file 后接非数字字符、再以 .txt 结尾的文件(如 fileA.txt、file_.txt,不匹配 file3.txt)
符号 含义
** 匹配当前目录及其所有子目录(包括深层嵌套的子目录)中的文件或目录

在 Linux 的 Glob 里,** 并不是所有 Shell 默认支持的,它是 Bash/Zsh 的扩展语法:

  • 在 Bash 里,必须先开启 globstar 扩展:shopt -s globstar
  • 在 Zsh 里 ** 默认可用

** 示例说明:

// 目录结构
project/
├── main.c
├── src/
│ ├── util.c
│ └── lib/
│ └── math.c
  • ls *.c:只会匹配当前目录下的 main.c
  • ls */*.c:只会匹配一层子目录里的 .c 文件 -> src/util.c
  • ls **/*.c:会匹配任意层级子目录里的 .c 文件 -> main.c src/util.c src/lib/math.c

花括号扩展是一种用于生成字符串序列的功能,通过 {} 符号来定义一组备选值,Shell 会自动将其展开为多个字符串,常用于快速生成批量文件名、路径或命令参数。

{} 本身不是 Glob 通配符,但常与 Glob 结合使用。

常见的形式:

形式 语法格式 效果 示例
基础列表扩展 {元素1,元素2,...,元素N} 直接展开所有元素(包括 Glob 通配符) {x,y,z} -> x y z;{a,b,*.txt} -> a b *.txt
范围扩展(数字/字母) {起始..结束} 生成连续数字/字母序列 {3..6} -> 3 4 5 6;{a..d} -> a b c d
带步长的范围扩展 {起始..结束..步长} 按步长生成序列 {2..10..2} -> 2 4 6 8 10
多个扩展(笛卡尔积) {扩展1}{扩展2}... 多个扩展独立展开后做笛卡尔积组合 {a,b}{1,?.log} -> a1 a?.log b1 b?.log

说明:

  • 元素可以是纯字符串或 Glob 通配符(*/?/[] 等),逗号前后无空格;含空格的元素需用引号包裹(如 {"a b",c})
  • 数字范围支持反向(如 {6..3} 生成 6 5 4 3),不支持小数
  • 字母范围支持大小写和反向(如 {F..C} 生成 F E D C)
  • 步长语法需要 Bash 4.0+ 或 Zsh
  • 所有形式均可灵活组合,形成复杂的批量操作模式(如 {app,web}_log_{2023..2025}-*.{txt,gz})
Terminal window
# 基本通配符
ls *.txt # 列出所有 .txt 文件
cp file?.log /backup/ # 复制 file1.log、fileA.log 等
# 字符集
rm data[0-9].csv # 删除 data0.csv 到 data9.csv
# 递归匹配(需 shopt -s globstar)
find . -name "*.py" # 等效于 ls **/*.py
# 花括号扩展
mkdir -p project/{src,bin,doc} # 批量创建目录
touch log_{2023..2025}-{01..12}.txt # 批量创建日志文件