在 Linux 中,通配符(Wildcards)是 shell 提供的特殊字符,用于模式匹配文件名或路径。以下是常见的通配符及其用法:
| 通配符 | 作用 | 示例 |
|---|---|---|
* |
匹配任意数量(0个或多个)任意字符 | ls *.txt(列出所有 .txt 文件) |
? |
匹配单个任意字符 | ls file?.txt(匹配 file1.txt,但不匹配 file10.txt) |
[] |
匹配括号内任意一个字符 | ls [abc]*.txt(匹配以 a、b 或 c 开头的 .txt 文件) |
范围匹配:
- [a-z]:匹配任意小写字母
- [0-9]:匹配任意数字
- [!a] 或 [^a]:匹配非 a 的字符
extglob)通过 shopt -s extglob 启用后支持更复杂的模式:
| 通配符 | 作用 | 示例 |
|---|---|---|
?(pattern) |
匹配 0 或 1 次 pattern |
ls ?(*.txt|.log)(匹配 .txt 或 .log 或空) |
*(pattern) |
匹配 0 次或多次 pattern |
ls *(backup)(匹配 backup、backupbackup 等) |
+(pattern) |
匹配 1 次或多次 pattern |
ls +(err|warn).log(匹配 err.log、warn.log 等) |
@(pattern1\|pattern2) |
匹配 任意一个 pattern |
ls @(*.sh|*.py)(匹配 .sh 或 .py 文件) |
!(pattern) |
匹配 不符合 pattern 的内容 |
ls !(*.bak)(排除所有 .bak 文件) |
{}用于生成组合或序列(不是通配符,但常用于路径匹配):
- 组合匹配:
bash
ls {file1,file2}.txt # 匹配 file1.txt 或 file2.txt
cp /path/{old,new} # 等价于 cp /path/old /path/new
- 序列生成:
bash
echo {1..5} # 输出 1 2 3 4 5
mkdir dir{01..10} # 创建 dir01 到 dir10
若需匹配特殊字符本身(如 *、?),使用转义符 \ 或引号:
ls \*.txt # 匹配名为 "*.txt" 的文件
ls "*?.log" # 匹配以 "?" 结尾的 .log 文件
bash
rm /tmp/*.tmpbash
mv image.{jpg,png} # 将 image.jpg 改为 image.pngbash
ls !(*.bak|*.tmp) # 列出非 .bak 或 .tmp 的文件(需 extglob)ls *.txt 会先由 Shell 展开文件列表再传递给 ls。echo *.xyz 无匹配时输出 *.xyz)。掌握这些通配符能极大提升命令行操作效率!