Uninote
Uninote
用户根目录
brdr
common
programming
docs
后端试题
问题讨论

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

注意事项

  1. 点文件:模式 * 不会匹配以 . 开头的隐藏文件(如 .bashrc

    ls .*      # 显示隐藏文件
    ls *       # 不显示隐藏文件
    
  2. 引号的影响

    echo *.txt     # 执行扩展
    echo "*.txt"   # 不扩展,输出字面量 *.txt
    
  3. 无匹配的情况:如果没有文件匹配,默认会显示原模式

    shopt -s nullglob  # 无匹配时返回空
    shopt -s failglob  # 无匹配时报错
    
  4. 递归匹配(Bash 4.0+):

    shopt -s globstar
    ls **/*.txt      # 匹配所有子目录中的 .txt 文件
    

与正则表达式的区别

Pattern Matching 正则表达式
* 匹配任意字符 .* 匹配任意字符
? 匹配单个字符 . 匹配单个字符
[abc] 字符集 [abc] 字符集
用于文件名匹配 用于文本匹配

Pattern Matching 是 Shell 编程中非常强大和常用的功能,掌握它能让文件操作变得高效便捷。

declare

word-splitting

点赞(0) 阅读(14) 举报
目录
标题