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.cls *.c:只会匹配当前目录下的main.cls */*.c:只会匹配一层子目录里的.c文件 ->src/util.cls **/*.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})
# 基本通配符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 # 批量创建日志文件