在 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/*.tmp
bash
mv image.{jpg,png} # 将 image.jpg 改为 image.png
bash
ls !(*.bak|*.tmp) # 列出非 .bak 或 .tmp 的文件(需 extglob)
ls *.txt
会先由 Shell 展开文件列表再传递给 ls
。echo *.xyz
无匹配时输出 *.xyz
)。掌握这些通配符能极大提升命令行操作效率!