通配符是shell中用于路径名展开(globbing)的匹配机制,核心包括*(匹配任意长度字符)、?(匹配单个字符)、[abc](匹配指定字符)等,不支持正则语法,且匹配前缀、后缀及目录结构需结合实际路径与命令使用。

通配符是 Shell 中最常用也最实用的文件匹配工具,精准匹配特定后缀的日志文件,关键在于理解通配符含义、避免常见误区,并结合实际路径和需求灵活使用。
掌握核心通配符含义
Shell 通配符不是正则表达式,而是路径展开(globbing)机制:
-
* 匹配任意长度字符(包括空),但不跨目录(不匹配
/) - ? 匹配任意单个字符(不能是空)
- [abc] 匹配方括号中任意一个字符;[a-z] 表示范围
- [!a-z] 或 [^a-z] 匹配不在该范围内的单个字符
- {log,err} 是大括号扩展(brace expansion),不是通配符,但常配合使用
精准匹配常见日志后缀
针对典型日志后缀,直接用对应模式即可,无需复杂正则:
-
*.log—— 匹配所有以.log结尾的文件(如app.log、access.log) -
*.log.2024*—— 匹配带年份的归档日志(如app.log.20240501、app.log.2024.gz) -
error?.log—— 匹配error1.log、errorA.log,但不匹配error10.log -
access.[0-9][0-9].log—— 匹配两位数字编号日志(如access.01.log、access.99.log) -
systemd-journald*.log—— 匹配前缀固定、后缀可变的日志(如systemd-journald.log、systemd-journald-audit.log)
避开常见匹配陷阱
很多“匹配失败”其实源于 shell 展开时机或路径问题:
- 通配符在 shell 执行命令前就展开,如果无匹配文件,多数命令会收到字面字符串(如
ls *.xyz无匹配时传入*.xyz,导致报错) - 点号
.是普通字符,*.log不会匹配隐藏文件(如.app.log),需显式写.*.log或用shopt -s dotglob开启隐藏文件匹配 - 大小写敏感:
*.LOG和*.log是不同模式;如需忽略大小写,可用shopt -s nocaseglob(bash 特有) - 避免误用引号:
"*.log"会禁用通配,变成字面匹配名为*.log的文件
配合命令提升实用性
单独匹配没意义,结合常用命令才能落地:
- 查看内容:
cat *.log(多个文件会连续输出)、tail -n 20 *.log(每个文件末 20 行) - 安全清理:
rm -i *.old *.bak,加-i确认每项 - 批量重命名:
for f in *.log; do mv "$f" "${f%.log}.backup"; done(%去后缀) - 统计数量:
printf '%s\n' *.log | wc -l(比ls *.log | wc -l更可靠,避免空格问题)
通配符本身不复杂,但匹配效果取决于你是否清楚它在 shell 中何时起作用、匹配什么、不匹配什么。多练几个真实路径下的例子,比如 ls /var/log/*.log 和 ls /var/log/*/*.log 的区别,很快就能形成直觉。











