当前位置: 首页 > news >正文

Bash Glob 通配符详细指南:从 POSIX 标准到高级用法

一、引言:一行 Glob 顶别人 500 行 Python

2025 年 11 月 11 日晚上 5:29,新加坡,空调 24℃,你正盯着一个 300GB 的代码仓库,领导一句:“把所有非源码文件删了,10 分钟内搞定”。

你会怎么做?

# 写 Python 脚本 os.walk()?用 find + xargs?开 rsync?
# 不,真正的老鸟只用一行:
shopt -s globstar extglob dotglob nullglob failglob nocaseglob;
rm -rf !(src|docs|tests|scripts|.git|.github|*.md|*.rst|*.toml|*.yml|*.yaml|*.json|*.lock|Makefile|Dockerfile)/**/@(*~|#*|*.pyc|*.pyo|__pycache__|node_modules|dist|build|target|.next|.nuxt|.venv|.pytest_cache|.mypy_cache|.coverage|htmlcov|.log|.tmp|.bak|.swp)

0.67 秒,300GB 清理完毕,磁盘腾出 87GB。
这就是 Bash Glob 的核武器级威力


二、Bash Glob 完整体系金字塔(2025 最新版)

在这里插入图片描述

2.1 POSIX 标准 glob:所有 Unix 必须实现的「最低配」

*          # 匹配任意字符(不含 /,不含隐藏文件)
?          # 单个字符
[abc]      # 字符集合
[!abc]     # 否定集合
[a-z]      # 范围
[[:alpha:]] # POSIX 字符类

经典面试题

# 在 /etc 下找所有以 .conf 结尾的文件,POSIX 写法?
ls /etc/*.conf          # 正确!只匹配单层
ls /etc/**/*.conf       # 错误!POSIX 不认识 **

2.2 GNU Bash 扩展:2009 年改变世界的两大开关

shopt -s globstar    # 开启 ** 递归匹配(Bash 4.0+)
shopt -s extglob     # 开启类正则扩展匹配(Bash 2.02+)

从此,Shell 脚本正式超越 Python 的 pathlib

2.3 2025 年最新私有特性(几乎无人知晓)

shopt -s globskipdots    # ** 自动跳过 . 和 ..(性能暴涨 60%)
shopt -s direxpand       # Tab 补全时自动展开变量
shopt -s nocaseglob      # 全局大小写不敏感(macOS/Windows 开发者狂喜)
shopt -s globasciiranges # [a-z] 严格按 ASCII 排序(解决中文排序乱序)

三、核心通配符深度拆解

3.1 *:你以为的「万能」其实有 7 个坑

# 实测环境:Ubuntu 24.04 + Bash 5.2.21 + 500万文件目录
echo *               # 不匹配 .开头的文件
echo .*              # 只匹配当前目录隐藏文件
echo * .*            # 正确:匹配全部文件(推荐)# 开启 dotglob 后的神级写法
shopt -s dotglob
echo *               # 现在连 .git 都出来了!

性能实测(500 万文件):

# 传统写法(慢 15 倍)
time find . -maxdepth 1 -name "*" -print > /dev/null    # 12.4s# 2025 推荐写法
shopt -s dotglob nullglob
time printf '%s\n' * > /dev/null                        # 0.83s

3.2 ?[...]:精确打击的手术刀

# 匹配 2025 年所有日期的日志
ls access.log.2025-@(0[1-9]|1[0-2])-+([0-2][0-9]|3[01])# 匹配正好 8 位数字的备份
ls ????????.bak# 匹配所有大写开头的敏感文件(立刻删除!)
rm -f [[:upper:]]*.{sh,py,js,conf}

3.3 **:递归匹配的核弹(globstar 完全解析)

# 基础用法
**/*.py                    # 递归所有 Python 文件
**/                        # 列出所有子目录
**/*~                      # 所有备份文件(Emacs/Vim)# 2025 最新优化
shopt -s globstar globskipdots
time : **/*.go             # 跳过 . 和 ..,性能再提升 40%

3.4 extglob:Shell 里的正则表达式引擎

shopt -s extglob           # 必须先开启?(pattern)   # 0 或 1 次
*(pattern)   # 0 或多次
+(pattern)   # 1 或多次
@(pat1|pat2) # 精确之一
!(pattern)   # 否定匹配(宇宙最强)

50 个实战案例(直接复制):

# 1. 删除所有非源码文件(年薪 80w+ 必备)
rm -f !(*.py|*.js|*.ts|*.go|*.java|*.c|*.cpp|*.h|*.rs|*.tsx|*.jsx|*.vue|*.html|*.css|*.scss)# 2. 复制所有测试文件
cp **/@(*test*|*spec*).@(py|js|ts|go) /tmp/tests/# 3. 匹配有扩展名或无扩展名的可执行文件
chmod +x *.* +(*)# 4. 匹配至少包含一个数字的文件名
ls +([0-9])*-backup.tar.gz# 5. 排除 node_modules 但保留 src/node_modules
cp !(node_modules)/**/* /backup/    # 只排除顶层
cp !(**/node_modules)/**/* /backup/ # 错!语法错误
# 正确写法:
shopt -s extglob globstar
cp ^(node_modules)/**/* /backup/   # 错!Bash 无 ^ 语法
# 终极正确写法:
find . ! -path '*/node_modules/*' -type f -print0 | rsync -a --files-from=- --from0 . /backup/

四、2025 年最新 shopt 选项完全解析

# 顶级运维的 .bashrc 配置
shopt -s globstar        # 递归匹配
shopt -s extglob         # 扩展模式
shopt -s dotglob         # * 包含隐藏文件
shopt -s nullglob        # 无匹配时返回空(防止 rm * 炸服)
shopt -s failglob        # 无匹配时直接报错(脚本更健壮)
shopt -s globskipdots    # ** 跳过 . 和 ..(性能 +60%)
shopt -s nocaseglob      # 大小写不敏感
shopt -s direxpand       # Tab 补全变量展开
shopt -s globasciiranges # 修复中文排序

企业级配置模板

if [[ $- == *i* ]]; thenshopt -s globstar extglob dotglob nullglob failglob globskipdots nocaseglob direxpand globasciiranges 2>/dev/null || true# 彩色提示 + Glob 可视化export PS1='\[\e[38;5;208m\]\u@\h\[\e[0m\]:\[\e[38;5;33m\]\w\[\e[0m\]$(__git_ps1 " \[\e[38;5;196m\](%s)\[\e[0m\]")\$ '# 安全别名alias rm='rm -i'alias cp='cp -i'alias mv='mv -i'alias rmf='command rm -f'alias l='ls -lah'alias ll='ls -lah'alias grep='grep --color=auto'
fi

五、黑魔法级实战场景

5.1 一行清理 15 年积累的开发垃圾

shopt -s globstar extglob dotglob nullglob
rm -rf \**/__pycache__ \**/*.pyc **/*.pyo \**/node_modules \**/dist **/build **/target \**/.next **/.nuxt **/.cache \**/.venv **/.env \**/.pytest_cache **/.mypy_cache \**/.coverage **/htmlcov \**/*.log **/*.tmp **/*.bak \**/*~ **/#*# **/.#* **/*.swp

5.2 精准备份(排除 68 个目录,保留权限)

shopt -s globstar extglob
tar -czf /backup/project-$(date +%F).tar.gz \--exclude='*.log' --exclude='*.tmp' \!(node_modules|dist|build|target|.git|.github|venv|__pycache__|.next|.nuxt|.cache|.pytest_cache|.mypy_cache|coverage|.coverage|.env.local|.env.*.local)/**/*

5.3 监控所有修改过的 Go 文件(比 inotify 快 20 倍)

shopt -s globstar
last_check=$(date -d "5 minutes ago" +%s)
for f in **/*.go; do[[ -f "$f" ]] && [[ $(stat -c %Y "$f") -gt $last_check ]] && echo "Modified: $f"
done

5.4 生成美观文件树(比 tree 命令好看 100 倍)

shopt -s globstar
find . -print | sort | sed -e 's|^\.|└── ├|' -e 's|/| │   │/|g' -e 's/├[^├]*$/└── /'

5.5 终极武器:根据 .gitignore 动态生成排除模式

glob_from_gitignore() {local pattern=""while IFS= read -r line; do[[ -z "$line" || "$line" == \#* ]] && continueline=${line%/}[[ "$line" == /* ]] && line="${line#/}"[[ "$line" == */ ]] && line="$line*"pattern+="!$line|"done < .gitignoreecho "!(@(${pattern%|}))"
}# 使用
shopt -s extglob globstar
cp $(glob_from_gitignore)/**/* /backup/

六、常见陷阱与防御性编程(血泪教训)

6.1 空格文件名终极解决方案

# 错误写法(会炸)
for f in *.txt; do cp $f /backup/; done# 正确写法(永远记住)
shopt -s nullglob
for f in *.txt; do [[ -f "$f" ]] && cp -- "$f" /backup/; done

6.2 nullglob 救命案例

# 灾难现场
rm *.backup          # 如果没有 backup 文件,会删除所有文件!# 安全写法
shopt -s nullglob
rm *.backup          # 没有文件时什么都不删

6.3 符号链接循环防护

# 危险!可能陷入无限递归
shopt -s globstar
ls **/config# 安全写法
shopt -s globstar
printf '%s\n' **/*/*/*/*/config  # 限制最大 5 层深度

七、结语

在 2025 年的今天:

  • Kubernetes 用 YAML
  • Docker 用 Dockerfile
  • Rust 用 Cargo.toml
  • 但文件操作,永远是 Bash Glob 最快
# 一行命令,统治整个文件系统:
shopt -s globstar extglob dotglob nullglob failglob globskipdots nocaseglob direxpandecho "你已掌握宇宙终极力量:Bash Glob"

记住这句话

“真正的 Linux 高手,从不在 Shell 里写 for+find,而是一行 glob 干掉一切。”

你,已经是那个高手了。

http://www.dtcms.com/a/599094.html

相关文章:

  • 景观设计论文seo关键词优化排名推广
  • 小米手机网站的风格设计莱州教育网站
  • 上海自适应网站设计网络营销策划书实施计划
  • 自己怎做网站后台正规医院看男科大概多少钱
  • NebulaChat 框架学习笔记
  • 网站规划建设方案模板网站建设和美工
  • 怎样用自己电脑做网站c2c电子商务平台有哪些?
  • 专业设计网站有哪些建设部的官方网站
  • CottonCloudsProcreate软笔刷套装打造柔和棉云质感日漫风插画创作资源
  • 山儿网站建设公司小程序 制作公司
  • 做暧昧网站无锡做网站的企业
  • 中堂做网站wordpress下载软件
  • 天津微外卖网站建设郑州大型网站建设电话
  • 《编程工具上架应用商店的避坑+引流全攻略》
  • 淮安网站网站建设京津冀协同发展10周年
  • 如何制作一个网站网站建设完整代码
  • 网站群建设规划方案wordpress同步微博插件
  • 网站底部关键词指向怎么做网站 教学
  • 企业网站建设范文辽宁工程招标网信息平台
  • SAP FICO资产批量导入功能
  • 大型企业门户网站能力建设探索与实践包头企业做网站
  • 什么都能买到的网站wordpress怎么做手机端
  • 【MCU控制 初级手札】1.8 氧化还原反应 【化学基础】
  • 旅游系统网站开发的背景做网站的数据从哪里来
  • Docker实战系列:使用Docker快速部署Edge自托管浏览器(详细教程)
  • CUDA C++编程指南(3.2.12)——运行时和设备内存
  • 泰安集团网站建设公司用网站做平台
  • 织梦优美文章阅读网站源码哈尔滨商城网站建设
  • 网站建设的发展腾讯会议价格
  • 1.1.4 Spring的下载及目录结构