filename expansion 中的Pattern Matching
我来详细解释一下 Bash Shell 中的 Pattern Matching(通配符匹配),这是 filename expansion(文件名扩展)的核心功能。
基本概念
Pattern Matching 是 Shell 用来匹配文件名的一种通配符系统,当你在命令行中使用通配符时,Shell 会自动将其扩展为匹配的文件名。
常用通配符
1. * - 匹配任意多个字符
# 匹配所有 .txt 文件
ls *.txt
# 匹配所有文件
ls *
# 匹配以 a 开头的文件
ls a*
# 匹配包含 test 的文件
ls *test*
2. ? - 匹配单个字符
# 匹配 file1.txt, file2.txt 等
ls file?.txt
# 匹配三个字符的 .txt 文件
ls ???.txt
3. [] - 字符集匹配
# 匹配 file1.txt 或 file2.txt
ls file[12].txt
# 匹配范围:a-z, 0-9
ls file[a-z].txt
ls file[0-9].txt
# 匹配数字 1,3,5
ls file[135].txt
# 排除某些字符
ls file[!0-9].txt # 不以数字结尾
4. {} - 生成组合(Brace Expansion)
# 生成序列
echo {1..5} # 1 2 3 4 5
echo {a..e} # a b c d e
echo {01..10} # 01 02 03 ... 10
# 组合扩展
echo file.{txt,md,pdf} # file.txt file.md file.pdf
echo {pre,post}{fix,script} # prefix prescript postfix postscript
高级用法
5. 字符类(Character Classes)
# POSIX 标准字符类
ls *[[:digit:]]* # 包含数字
ls *[[:alpha:]]* # 包含字母
ls *[[:alnum:]]* # 包含字母或数字
ls *[[:lower:]]* # 包含小写字母
ls *[[:upper:]]* # 包含大写字母
ls *[[:space:]]* # 包含空格
ls *[[:punct:]]* # 包含标点符号
6. 扩展通配符(需要开启 extglob)
shopt -s extglob # 开启扩展模式
# 扩展通配符:
# ?(pattern) - 匹配 0 或 1 次
# *(pattern) - 匹配 0 或多次
# +(pattern) - 匹配 1 或多次
# @(pattern) - 匹配指定的模式之一
# !(pattern) - 匹配除指定模式外的
# 示例
ls file@(.txt|.md) # file.txt 或 file.md
ls !(*.txt) # 所有不是 .txt 的文件
ls file+([0-9]).txt # file1.txt, file123.txt 等
实用示例
# 1. 备份当前目录下所有 .txt 文件
cp *.txt backup/
# 2. 删除所有临时文件
rm *.tmp *.temp *.bak
# 3. 批量重命名
for file in image[0-9].jpg; do
mv "$file" "picture${file#image}"
done
# 4. 查找特定格式的文件
ls report_2024_{01..12}_{01..31}.pdf
# 5. 复杂的模式匹配
# 匹配:以字母开头,包含数字,以 .log 结尾的文件
ls [[:alpha:]]*[[:digit:]]*.log
注意事项
-
点文件:模式
*不会匹配以.开头的隐藏文件(如.bashrc)ls .* # 显示隐藏文件 ls * # 不显示隐藏文件 -
引号的影响:
echo *.txt # 执行扩展 echo "*.txt" # 不扩展,输出字面量 *.txt -
无匹配的情况:如果没有文件匹配,默认会显示原模式
shopt -s nullglob # 无匹配时返回空 shopt -s failglob # 无匹配时报错 -
递归匹配(Bash 4.0+):
shopt -s globstar ls **/*.txt # 匹配所有子目录中的 .txt 文件
与正则表达式的区别
| Pattern Matching | 正则表达式 |
|---|---|
* 匹配任意字符 |
.* 匹配任意字符 |
? 匹配单个字符 |
. 匹配单个字符 |
[abc] 字符集 |
[abc] 字符集 |
| 用于文件名匹配 | 用于文本匹配 |
Pattern Matching 是 Shell 编程中非常强大和常用的功能,掌握它能让文件操作变得高效便捷。
