bash的特性-常用的通配符

一、前言

在 Linux Shell 编程和日常使用中,通配符(Wildcards) 是 Bash 提供的一种强大机制,用于匹配文件名、路径、参数等,极大提升了命令行操作的效率。

本文将带你全面了解 Bash 中常用的通配符,包括:

✅ 通配符的基本概念

✅ 常用通配符(如 *, ?, [], {})的使用方法

✅ 通配符在命令行与脚本中的应用

✅ 通配符与正则表达式的区别

✅ 实战案例:批量操作文件、日志处理、自动化脚本

✅ 常见问题与解决方案

并通过完整示例帮助你快速掌握 Bash 通配符的使用与技巧。

二、什么是通配符?

通配符(Wildcard) 是 Bash 中用于模式匹配的特殊字符,主要用于匹配文件名或路径名。它们通常用于 lscprmmvfind 等命令中,帮助用户快速操作多个文件。

三、Bash 中常用的通配符一览

通配符 含义 示例
* 匹配任意数量的任意字符 *.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 文件

四、通配符详解与使用示例

✅ 1. * ------ 匹配任意数量的字符

bash 复制代码
$ ls *.txt

匹配所有以 .txt 结尾的文件,如:

复制代码
file1.txt  file2.txt  notes.txt

✅ 2. ? ------ 匹配单个任意字符

bash 复制代码
$ ls file?.txt

匹配:

复制代码
file1.txt  fileA.txt  fileZ.txt

但不匹配 file10.txtfile.txt

✅ 3. [] ------ 匹配括号内的任意一个字符

bash 复制代码
$ ls [abc].txt

匹配:

复制代码
a.txt  b.txt  c.txt

也可以使用范围:

bash 复制代码
$ ls [a-z].txt

匹配所有小写字母命名的 .txt 文件。

bash 复制代码
$ ls [0-9].txt

匹配数字命名的 .txt 文件。

✅ 4. [!][^] ------ 匹配不在括号中的字符

bash 复制代码
$ ls [!a].txt

匹配除 a.txt 以外的所有单字符命名的 .txt 文件。

bash 复制代码
$ ls [^0-9].txt

匹配非数字命名的 .txt 文件。

✅ 5. {} ------ 匹配多个指定字符串

bash 复制代码
$ ls file{1,2,3}.txt

匹配:

复制代码
file1.txt  file2.txt  file3.txt

也可以用于路径:

bash 复制代码
$ cp config/{dev,prod}.conf /etc/app/

复制 config/dev.confconfig/prod.conf 到目标目录。

✅ 6. **(递归通配符) ------ 匹配多级目录(需启用)

bash 复制代码
shopt -s globstar
$ ls **/*.log

匹配当前目录及其子目录下的所有 .log 文件。

五、通配符在 Shell 脚本中的应用

✅ 示例1:批量重命名文件

bash 复制代码
#!/bin/bash

for file in *.txt; do
    mv "$file" "backup_$file"
done

将当前目录下所有 .txt 文件重命名为 backup_*.txt

✅ 示例2:批量删除临时文件

bash 复制代码
rm *.tmp *.bak

删除所有 .tmp.bak 文件。

✅ 示例3:递归处理日志文件(需启用 globstar

bash 复制代码
shopt -s globstar
for log in **/*.log; do
    echo "Processing $log"
    cat "$log" | grep "ERROR" >> errors.log
done

遍历所有子目录中的 .log 文件,提取包含 ERROR 的行,并追加到 errors.log

✅ 示例4:根据字符范围筛选文件

bash 复制代码
ls [A-Z]*.sh

列出所有以大写字母开头的 Shell 脚本。

六、通配符 vs 正则表达式

特性 通配符(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 的行,并汇总到一个文件中。

✅ 实现脚本:

bash 复制代码
#!/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 编码

九、总结对比表:Bash 常用通配符一览

通配符 含义 示例
* 匹配任意数量字符 *.txt
? 匹配单个字符 file?.txt
[] 匹配括号内任意一个字符 [a-z].txt
[!] 匹配不在括号中的字符 [!a].txt
{} 匹配多个指定字符串 file{1,2}.txt
** 递归匹配目录 **/*.log(需启用)

十、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
后台开发者Ethan27 分钟前
Python需要了解的一些知识
开发语言·人工智能·python
常利兵1 小时前
Kotlin作用域函数全解:run/with/apply/let/also与this/it的魔法对决
android·开发语言·kotlin
幼稚园的山代王1 小时前
Kotlin-基础语法练习一
android·开发语言·kotlin
重生成为编程大王2 小时前
Java ConcurrentHashMap 深度解析
java·开发语言
tanyongxi662 小时前
C++ 特殊类设计与单例模式解析
java·开发语言·数据结构·c++·算法·单例模式
遗憾皆是温柔2 小时前
24. 什么是不可变对象,好处是什么
java·开发语言·面试·学习方法
wearegogog1232 小时前
C语言中的输入输出函数:构建程序交互的基石
c语言·开发语言·交互
Fine姐2 小时前
The Network Link Layer: 无线传感器中Delay Tolerant Networks – DTNs 延迟容忍网络
开发语言·网络·php·硬件架构
HAPPY酷3 小时前
给纯小白的Python操作 PDF 笔记
开发语言·python·pdf
liulilittle3 小时前
BFS寻路算法解析与实现
开发语言·c++·算法·宽度优先·寻路算法·寻路