bash常用通配符的使用

 更新时间:2025年08月11日 09:29:37   作者:咖啡の猫  
通配符是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.*—— 匹配任意数量的字符

$ ls *.txt

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

file1.txt  file2.txt  notes.txt

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

$ ls file?.txt

匹配:

file1.txt  fileA.txt  fileZ.txt

但不匹配 file10.txtfile.txt

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

$ ls [abc].txt

匹配:

a.txt  b.txt  c.txt

也可以使用范围:

$ ls [a-z].txt

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

$ ls [0-9].txt

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

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

$ ls [!a].txt

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

$ ls [^0-9].txt

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

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

$ ls file{1,2,3}.txt

匹配:

file1.txt  file2.txt  file3.txt

也可以用于路径:

$ cp config/{dev,prod}.conf /etc/app/

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

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

shopt -s globstar
$ ls **/*.log

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

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

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

#!/bin/bash

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

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

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

rm *.tmp *.bak

删除所有 .tmp.bak 文件。

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

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

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

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

ls [A-Z]*.sh

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

六、通配符 vs 正则表达式

特性通配符(Glob)正则表达式(Regex)
使用场景文件名匹配、路径匹配文本内容匹配、字符串处理
支持命令ls, cp, rm, find, bashgrep, 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 编码

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

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

十、结语

到此这篇关于bash常用通配符的使用的文章就介绍到这了,更多相关bash 通配符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • git 删除分支和回滚的实例详解

    git 删除分支和回滚的实例详解

    这篇文章主要介绍了git 删除分支和回滚的实例详解的相关资料,希望通过本文大家能理解掌握这部分内容,需要的朋友可以参考下
    2017-09-09
  • linux文件目录默认权限(详解)

    linux文件目录默认权限(详解)

    下面小编就为大家带来一篇linux文件目录默认权限(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 详解bash中的退出状态机制

    详解bash中的退出状态机制

    这篇文章主要介绍了详解bash中的退出状态机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Shell脚本中判断输入参数个数的方法

    Shell脚本中判断输入参数个数的方法

    这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数,需要的朋友可以参考下
    2014-10-10
  • linux命令详解之chkconfig命令使用方法

    linux命令详解之chkconfig命令使用方法

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接,下面看一下它是如何使用的
    2014-01-01
  • Python创建、删除桌面、启动组快捷方式的例子分享

    Python创建、删除桌面、启动组快捷方式的例子分享

    这篇文章主要介绍了Python创建、删除桌面、启动组快捷方式的例子分享,需要的朋友可以参考下
    2014-04-04
  • 根据公司需求写的一个linux 巡检小脚本

    根据公司需求写的一个linux 巡检小脚本

    这篇文章主要介绍了根据公司需求写的一个linux 巡检小脚本,可以用来检查服务器的一些运行状况,需要的朋友可以参考下
    2017-04-04
  • Bash Shell脚本学习小结

    Bash Shell脚本学习小结

    今天需要写一个Shell脚本。很简单,判断一个日志文件是否大大于2G,如果大于2G则删除。久了没有写bash,竟然一点都想不起来写了。于是复习了一下,下面对今天的学习做个小结
    2013-01-01
  • Linux xargs命令如何将命令的结果作为参数

    Linux xargs命令如何将命令的结果作为参数

    xargs是给命令传递参数的一个过滤器,也是组合多个命令的工具,这篇文章主要介绍了Linux xargs命令如何将命令的结果作为参数,需要的朋友可以参考下
    2023-04-04
  • 在Linux命令行中终止进程的操作命令

    在Linux命令行中终止进程的操作命令

    如果你想在linux上停止某个进程,你会怎么操作,本文小编给大家详细介绍了如何在 Linux 命令行中终止进程,文中通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2023-12-12

最新评论