一、什么是通配符?
通配符是一种特殊字符,用于在Linux命令行中匹配文件名或路径名。它们被shell(如bash)解释,而不是由命令本身处理。
二、核心通配符
1. 星号 * - 匹配任意多个字符(包括0个)
# 基本用法
ls *.txt # 列出所有以.txt结尾的文件
rm * # 删除当前目录所有文件(危险!)
cp *.jpg /images/ # 复制所有jpg图片
# 组合使用
ls file* # 匹配file、file1、file.txt等
ls a*b # 匹配ab、acb、a123b等
2. 问号 ? - 匹配任意单个字符
# 精确匹配一个字符
ls file?.txt # 匹配file1.txt、fileA.txt,但不匹配file10.txt
rm ?? # 删除所有两个字符的文件名
ls a?b # 匹配aab、a3b、a-b,但不匹配ab
3. 方括号 [] - 匹配指定范围内的任意单个字符
# 字符集合
ls [abc]* # 以a、b或c开头的文件
rm file[0-9].txt # 删除file0.txt到file9.txt
# 范围表示
ls [a-z] # 小写字母
ls [A-Z] # 大写字母
ls [0-9] # 数字
ls [a-zA-Z] # 所有字母
# 组合使用
ls [0-9][0-9] # 两个数字的文件名
ls [a-cx-z] # a-c或x-z范围
4. 排除模式 [!] 或 [^] - 匹配不在范围内的字符
ls [!0-9]* # 不以数字开头的文件
rm [^a-z]* # 删除不以小写字母开头的文件
ls file[!0-9].txt # file后跟非数字字符
三、高级通配符(需开启extglob)
开启扩展通配符
shopt-s extglob # 开启
shopt-u extglob # 关闭
扩展模式语法
| 模式 | 含义 | 示例 |
|---|
*(pattern) | 匹配0次或多次 | ls *(abc) |
+(pattern) | 匹配1次或多次 | rm file+([0-9]) |
?(pattern) | 匹配0次或1次 | ls ?(test)file |
@(pattern) | 精确匹配1次 | cp @(txt|pdf)/ |
!(pattern) | 不匹配 | rm !(*.txt) |
# 实用示例
rm !(*.txt) # 删除非txt文件
ls+([0-9]) # 显示纯数字文件
cp @(jpg|png)/ # 复制jpg或png文件
四、转义通配符
当文件名包含通配符字符时,需要转义:
# 方法1:反斜杠
ls \* # 显示名为*的文件
cat file\? # 显示名为file?的文件
# 方法2:引号
ls'*'# 同上
cat'file?'# 同上
# 方法3:双引号(部分转义)
ls"*"# 也有效
五、实战示例
文件管理
# 批量操作
chmod755 *.sh # 所有脚本文件添加执行权限
rename 's/\.JPG$/.jpg/' *.JPG # 批量重命名(需安装rename)
tar -czf backup.tar.gz *.doc *.pdf # 打包特定文件
# 选择性删除
rm-f *~ # 删除所有备份文件(以~结尾)
rm-rf [A-Z]* # 删除所有大写字母开头的文件
结合find命令
# find使用自己的通配符语法(需要引号)
find . -name"*.txt"# 查找txt文件
find . -name"[a-z]*.jpg"# 小写字母开头的jpg
find . -name"[!.]*"# 不以点开头的文件
六、常见陷阱与注意事项
1. 隐藏文件
ls * # 不显示隐藏文件(以.开头)
ls .* # 显示隐藏文件(注意:包括.和..)
ls .[!.]* # 安全显示隐藏文件(排除.和..)
2. 无匹配时的行为
ls *.xyz # 如果没有xyz文件,shell可能直接传递"*.xyz"
# 导致ls报错:没有该文件
3. 通配符与正则表达式的区别
# 通配符(文件名扩展)
*.txt # 所有txt文件
# 正则表达式(文本匹配)
.*\.txt # 同上,但用于grep等工具
七、快速参考表
| 通配符 | 含义 | 示例 | 匹配 | 不匹配 |
|---|
* | 任意字符串 | a*c | ac, abc, aXc | ab, bbc |
? | 单个字符 | a?c | abc, aXc | ac, abbc |
[abc] | a或b或c | [ab]c | ac, bc | cc, dc |
[a-z] | a到z | [a-c]x | ax, bx, cx | dx, Ax |
[!a] | 非a | [!0-9]* | a.txt, b.pdf | 1.txt, 2.doc |