文章目录
- $ ls *.txt 匹配所有以 .txt 结尾的文件,如: file1.txt file2.txt notes.txt
- $ ls file?.txt 匹配: file1.txt fileA.txt fileZ.txt 但不匹配 file10.txt 或 file.txt。
- $ ls [abc].txt 匹配: a.txt b.txt c.txt 也可以使用范围: $ ls [a-z].txt 匹配所有小写字母命名的 .txt 文件。 $ ls [0-9].txt 匹配数字命名的 .txt 文件。
- $ ls [!a].txt 匹配除 a.txt 以外的所有单字符命名的 .txt 文件。 $ ls [^0-9].txt 匹配非数字命名的 .txt 文件。
- $ ls file{1,2,3}.txt 匹配: file1.txt file2.txt file3.txt 也可以用于路径: $ cp config/{dev,prod}.conf /etc/app/ 复制 config/dev.conf 和 config/prod.conf 到目标目录。
- shopt -s globstar $ ls **/*.log 匹配当前目录及其子目录下的所有 .log 文件。
- #!/bin/bash for file in *.txt; do mv “$file” “backup_$file” done 将当前目录下所有 .txt 文件重命名为 backup_*.txt。
- rm *.tmp *.bak 删除所有 .tmp 和 .bak 文件。
- shopt -s globstar for log in **/*.log; do echo “Processing $log” cat “$log” | grep “ERROR” >> errors.log done 遍历所有子目录中的 .log 文件,提取包含 ERROR 的行,并追加到 errors.log。
- ls [A-Z]*.sh 列出所有以大写字母开头的 Shell 脚本。
- 你有一个日志目录,结构如下: /logs/ ├── app1/ │ ├── 2025-07-01.log │ └── 2025-07-02.log ├── app2/ │ ├── 2025-07-01.log │ └── 2025-07-02.log 你想提取所有日志中包含 ERROR 的行,并汇总到一个文件中。
- #!/bin/bash shopt -s globstar for log in /logs/**/*.log; do grep “ERROR” “$log” >> /tmp/errors.log done echo “已提取所有 ERROR 日志到 /tmp/errors.log”
目录
- 一、前言
- 二、什么是通配符?
- 三、Bash 中常用的通配符一览
- 四、通配符详解与使用示例
- ✅ 1.*—— 匹配任意数量的字符
- ✅ 2.?—— 匹配单个任意字符
- ✅ 3.[]—— 匹配括号内的任意一个字符
- ✅ 4.[!]或[^]—— 匹配不在括号中的字符
- ✅ 5.{}—— 匹配多个指定字符串
- ✅ 6.**(递归通配符) —— 匹配多级目录(需启用)
- 五、通配符在 Shell 脚本中的应用
- ✅ 示例1:批量重命名文件
- ✅ 示例2:批量删除临时文件
- ✅ 示例3:递归处理日志文件(需启用globstar)
- ✅ 示例4:根据字符范围筛选文件
- 六、通配符 vs 正则表达式
- 七、实战案例:日志文件批量处理
- 📌 需求背景:
- ✅ 实现脚本:
- 八、常见问题与解决方案
- 九、总结对比表:Bash 常用通配符一览
- 十、结语
在 Linux Shell 编程和日常使用中,通配符(Wildcards) 是 Bash 提供的一种强大机制,用于匹配文件名、路径、参数等,极大提升了命令行操作的效率。
本文将带你全面了解 Bash 中常用的通配符,包括:
✅ 通配符的基本概念
✅ 常用通配符(如 *, ?, [], {})的使用方法
✅ 通配符在命令行与脚本中的应用
✅ 通配符与正则表达式的区别
✅ 实战案例:批量操作文件、日志处理、自动化脚本
✅ 常见问题与解决方案
并通过完整示例帮助你快速掌握 Bash 通配符的使用与技巧。
通配符(Wildcard) 是 Bash 中用于模式匹配的特殊字符,主要用于匹配文件名或路径名。它们通常用于 ls、cp、rm、mv、find 等命令中,帮助用户快速操作多个文件。
| 通配符 | 含义 | 示例 |
|---|---|---|
| * | 匹配任意数量的任意字符 | *.txt → 匹配所有 .txt 文件 |
| ? | 匹配任意一个字符 | file?.txt → 匹配 file1.txt, fileA.txt |
| [] | 匹配括号中的任意一个字符 | [abc] → 匹配 a、b 或 c |
| [!] 或 [^] | 匹配不在括号中的字符 | [!a-z] → 匹配非小写字母 |
| {} | 匹配多个指定的字符串 | file{1,2,3}.txt → 匹配 file1.txt, file2.txt, file3.txt |
| **(扩展) | 递归匹配目录(需启用 shopt -s globstar) | **/*.txt → 匹配所有子目录下的 .txt 文件 |
$ ls *.txt
匹配所有以 .txt 结尾的文件,如:
file1.txt file2.txt notes.txt
$ ls file?.txt
匹配:
file1.txt fileA.txt fileZ.txt
但不匹配 file10.txt 或 file.txt。
$ ls [abc].txt
匹配:
a.txt b.txt c.txt
也可以使用范围:
$ ls [a-z].txt
匹配所有小写字母命名的 .txt 文件。
$ ls [0-9].txt
匹配数字命名的 .txt 文件。
$ ls [!a].txt
匹配除 a.txt 以外的所有单字符命名的 .txt 文件。
$ ls [^0-9].txt
匹配非数字命名的 .txt 文件。
$ ls file{1,2,3}.txt
匹配:
file1.txt file2.txt file3.txt
也可以用于路径:
$ cp config/{dev,prod}.conf /etc/app/
复制 config/dev.conf 和 config/prod.conf 到目标目录。
shopt -s globstar
$ ls **/*.log
匹配当前目录及其子目录下的所有 .log 文件。
#!/bin/bash
for file in *.txt; do
mv "$file" "backup_$file"
done
将当前目录下所有 .txt 文件重命名为 backup_*.txt。
rm *.tmp *.bak
删除所有 .tmp 和 .bak 文件。
shopt -s globstar
for log in **/*.log; do
echo "Processing $log"
cat "$log" | grep "ERROR" >> errors.log
done
遍历所有子目录中的 .log 文件,提取包含 ERROR 的行,并追加到 errors.log。
ls [A-Z]*.sh
列出所有以大写字母开头的 Shell 脚本。
| 特性 | 通配符(Glob) | 正则表达式(Regex) |
|---|---|---|
| 使用场景 | 文件名匹配、路径匹配 | 文本内容匹配、字符串处理 |
| 支持命令 | ls, cp, rm, find, bash | grep, sed, awk, perl, python |
| 表达方式 | 简洁直观 | 更复杂、功能强大 |
| 是否支持捕获 | ❌ 不支持 | ✅ 支持 |
| 是否支持分组 | ❌ 不支持 | ✅ 支持 |
📌 注意: 通配符主要用于文件名和路径匹配,正则表达式用于文本内容匹配。
你有一个日志目录,结构如下:
/logs/ ├── app1/ │ ├── 2025-07-01.log │ └── 2025-07-02.log ├── app2/ │ ├── 2025-07-01.log │ └── 2025-07-02.log
你想提取所有日志中包含 ERROR 的行,并汇总到一个文件中。
#!/bin/bash
shopt -s globstar
for log in /logs/**/*.log; do
grep "ERROR" "$log" >> /tmp/errors.log
done
echo "已提取所有 ERROR 日志到 /tmp/errors.log"
| 问题 | 原因 | 解决方案 |
|---|---|---|
| No such file or directory | 没有匹配的文件 | 使用 nullglob 选项避免报错 |
| 通配符未展开 | 通配符被引号包裹 | 去掉引号或使用 eval |
| ** 未启用 | 未启用 globstar | 执行 shopt -s globstar |
| 通配符匹配过多文件 | 通配符太宽泛 | 使用更精确的匹配模式 |
| 中文文件名匹配失败 | 编码问题 | 确保终端使用 UTF-8 编码 |
| 通配符 | 含义 | 示例 |
|---|---|---|
| * | 匹配任意数量字符 | *.txt |
| ? | 匹配单个字符 | file?.txt |
| [] | 匹配括号内任意一个字符 | [a-z].txt |
| [!] | 匹配不在括号中的字符 | [!a].txt |
| {} | 匹配多个指定字符串 | file{1,2}.txt |
| ** | 递归匹配目录 | **/*.log(需启用) |
到此这篇关于bash常用通配符的使用的文章就介绍到这了,更多相关bash 通配符内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Linux中shell解析脚本的通配符、元字符、转义符说明
- Shell中通配符的具体使用
- Python 实用技巧之利用Shell通配符做字符串匹配
- PowerShell中使用通配符匹配文件路径的例子
- PowerShell中使用Like运算符配合通配符查找字符串例子