Bash 中的 shopt -s globstar:递归 Glob 模式详解 - 教程

news/2025/10/29 14:11:31/文章来源:https://www.cnblogs.com/gccbuaa/p/19174260

引言

在 Unix-like 系统中,Bash(Bourne-Again SHell)作为最流行的命令行 shell,已成为开发者和系统管理员的必备工具。Bash 不仅仅是一个简单的命令解释器,它还提供了强大的文件路径扩展机制,即“globbing”(通配符匹配)。Globbing 允许用户使用如 *? 等模式来匹配文件和目录,而无需编写复杂的正则表达式或调用外部工具。这使得文件操作变得高效而直观。

然而,传统的 globbing 模式有一个显著的局限性:它无法递归遍历子目录。例如,使用 ls *.txt 只能匹配当前目录下的 .txt 文件,而忽略嵌套在子目录中的文件。这在处理复杂目录结构时常常令人沮丧,尤其是项目目录或日志文件夹中文件层层嵌套的情况下。幸运的是,Bash 4.0 版本引入了一个名为“globstar”的 shell 选项,通过 shopt -s globstar 启用,它让双星号 ** 成为递归匹配的利器。 这个选项将 globbing 的能力扩展到整个目录树,让用户能够轻松实现如 ls **/*.txt 这样的递归文件查找。

本文将详细介绍 globstar 的原理、启用方法、基本与高级用法、实际应用场景,以及与传统工具如 find 的比较,确保你能立即上手。

globstar 的历史与启用方法

globstar 并非 Bash 的原创功能,它受到了其他 shell 如 Zsh 和 Ksh93 的启发。这些 shell 早在 Bash 4.0(2009 年发布)之前就已支持递归 globbing。 Bash 的引入 globstar 旨在增强其与这些现代 shell 的兼容性,同时保持向后兼容性。默认情况下,globstar 是禁用的,这避免了潜在的意外行为——因为在旧版 Bash 中,** 仅被视为单个 * 的变体,仅匹配当前目录。

要启用 globstar,只需在 Bash 会话中执行以下命令:

shopt -s globstar

这里的 shopt 是 Bash 的内置命令,用于管理 shell 选项(shell options)。-s 参数表示“set”(设置),globstar 是选项名称。执行后,你可以通过 shopt globstar 检查状态,它会输出 globstar on。 如果想临时禁用,可以使用 shopt -u globstar-u 为 unset),或在脚本开头添加 shopt -u globstar 以确保兼容旧环境。

对于永久启用,你可以将 shopt -s globstar 添加到 ~/.bashrc 文件中。这样,每次启动 Bash 时都会自动加载。需要注意的是,globstar 要求 Bash 版本至少 4.0。如果你使用的是较旧的系统(如某些嵌入式设备),可能需要升级 Bash 或回退到 find 等工具。

在脚本中,检查 globstar 是否启用也很重要。可以使用条件语句:

if shopt -q globstar; thenecho "globstar 已启用"# 执行递归 glob 代码
elseecho "globstar 未启用,请使用 find 命令"# 备选方案
fi

shopt -q(quiet 模式)会静默执行,并根据选项状态设置退出码(0 表示 on,非 0 表示 off)。这种检查确保脚本在不同环境中鲁棒运行。

基本用法:从简单递归查找开始

启用 globstar 后,** 的行为发生质变。它不再是简单的通配符,而是递归匹配器:** 会匹配当前目录下的所有文件和零或更多层级的目录及子目录。 最经典的示例就是用户提到的 ls **/*.txt,它会递归查找当前目录树中所有 .txt 文件。

假设你的目录结构如下:

project/
├── README.txt
├── src/
│   ├── main.py
│   └── utils/
│       └── helper.txt
└── docs/└── guide.txt

不启用 globstar 时,ls *.txt 只输出 README.txt。但启用后,ls **/*.txt 会输出:

README.txt
src/utils/helper.txt
docs/guide.txt

这大大简化了文件搜索,无需 find . -name "*.txt" 的冗长语法。

另一个基本示例:列出所有子目录。使用 ls **/ 会递归列出所有目录路径,如 src/ utils/ docs/ 等。 注意末尾的 / 确保只匹配目录(详见高级用法)。

在 for 循环中,globstar 同样强大:

for file in **/*.log; doecho "处理日志: $file"# 例如:tail -f "$file"
done

这会遍历所有 .log 文件,进行批量处理,如日志分析或备份。 相比 for file in $(find . -name "*.log"); do ... done,globstar 版本更简洁,且避免了命令替换的潜在问题(如文件名中空格)。

globstar 还支持数组赋值:

txt_files=(**/*.txt)
echo "找到 ${#txt_files[@]} 个 txt 文件"
for file in "${txt_files[@]}"; doecho "$file"
done

${#txt_files[@]} 返回数组长度,便于统计文件数。这种方式比管道 ls **/*.txt | wc -l 更高效,因为它不创建子 shell。

高级用法:组合模式与排除技巧

globstar 的真正魅力在于与其它 glob 字符的组合,以及细粒度控制。Bash 的 glob 包括 *(匹配任意字符序列,不包括 /)、?(单个字符)、[ ](字符类)和 { }(大括号扩展)。启用 globstar 后,这些可以与 ** 无缝结合。

首先,区分 ****/

  • **:匹配文件和目录。例如,echo ** 会列出所有文件和目录路径,包括嵌套的。
  • **/:后跟 / 时,只匹配目录和子目录。例如,printf "%s\n" **/ 会输出所有目录路径,如 src/ docs/ src/utils/。 这类似于 find . -type d,但更简洁。

组合示例:查找特定子目录下的文件,如 **/{src,docs}/*.py。这会递归匹配 srcdocs 目录下的所有 .py 文件。 大括号 {src,docs} 是 Bash 的扩展功能,与 globstar 完美协作。

字符类示例:**/.[^.]* 匹配所有隐藏文件(以 . 开头,但不以 .. 开头)。[!.]* 排除以 . 开头的文件。 完整命令:ls **/.[!.]* 递归列出非隐藏隐藏文件?不,[!.]* 匹配不以 . 开头的文件。修正:要匹配隐藏文件,ls **/.[!.]* 实际匹配以 . 开头但第二个字符不是 . 的文件,如 .git 但排除 ..

排除模式是高级用法中的亮点。虽然 Bash glob 不原生支持否定,但可以通过 !(扩展 glob)结合。启用 shopt -s extglob 后,可以使用 !(pattern) 排除。 示例:ls **/*.txt !**/backup/*.txt 查找所有 .txt 但排除 backup 目录下的。

另一个高级技巧:深度限制。虽然 globstar 默认无深度限制,但结合 {1,3}(大括号范围)模拟:**/{1,3}/*.txt 但这不精确,因为 ** 已递归。实际中,对于深度控制,仍推荐 find。但对于模式如 **/*.{jpg,png},它高效匹配图像文件。

在脚本中,globstar 可用于条件匹配:

case "$1" in**/*.zip) unzip "$1" ;;**/*.tar.gz) tar -xzf "$1" ;;*) echo "不支持的文件类型" ;;
esac

这根据递归路径自动解压。

与 find 命令的比较:何时选择 globstar

globstar 常常被视为 find 的轻量替代品,但两者各有优劣。find 是外部命令,支持复杂过滤(如 -mtime 时间戳、-size 大小),并可执行动作(如 -exec)。globstar 则纯 shell 内部,速度更快,无需 fork 子进程。

比较示例:递归查找 .txt 文件。

  • globstar:wc -l **/*.txt 统计所有 txt 行数。
  • find:find . -name "*.txt" -exec wc -l {} + 类似,但更慢。

基准测试显示,在大型目录中,globstar 可快 2-5 倍,因为它避免了外部调用。 但 find 支持 -prune 排除目录,如 find . -path "./backup" -prune -o -name "*.txt" -print,而 globstar 需要 extglob 辅助。

何时用 globstar?简单模式匹配、脚本内循环。

何时用 find?复杂查询、权限检查。

最佳实践:小项目用 globstar,大型系统用 find。

实际应用场景:从日常到脚本编写

globstar 在实际工作中无处不在。以下是几个实用场景。

1. 文件备份与同步

备份所有源代码:tar -cf backup.tar **/{*.py,*.sh}。这打包当前目录下所有 Python 和 shell 脚本,递归子目录。 同步到远程:rsync -av **/*.html user@server:/web/ 高效传输网站文件。

2. 批量文件处理

清理旧日志:rm **/*.log.(old|bak) 删除以 .old.bak 结尾的日志。结合日期:但 globstar 无时间过滤,可与 find 混合:find . -name "**/*.log" -mtime +7 -delete

图像处理:假设有 ImageMagick,mogrify -resize 800x **/*.{jpg,png} 批量缩放所有图像。

3. 开发工作流

在 Git 项目中,搜索变更:git diff **/*.py 但 git 不直接支持;实际用 grep -r "pattern" **/*.py 递归 grep。 测试覆盖:pytest **/test_*.py 运行所有测试文件。

4. 系统管理

监控服务:ps aux | grep **/proc/[0-9]*/status 但 procfs 特殊;更实用:kill **/*.pid 清理进程 ID 文件。

在 Docker 或 CI/CD 中,globstar 简化 artifact 收集:如 GitLab CI 的 artifacts: paths: - "**/*.jar" 递归打包 JAR 文件。

5. 脚本示例:智能文件整理器

以下是一个完整脚本,利用 globstar 整理下载文件夹:

#!/bin/bash
shopt -s globstar  # 启用 globstar
shopt -s extglob   # 启用扩展 glob
downloads="$HOME/Downloads"
cd "$downloads" || exit 1
# 移动图像
mv **/*.{jpg,jpeg,png,gif} Pictures/ 2>/dev/null
# 移动文档
mv **/*.{pdf,docx,txt} Documents/ 2>/dev/null
# 移动压缩包
mv **/*.{zip,rar,tar.gz} Archives/ 2>/dev/null
echo "整理完成!"

这个脚本会递归扫描 Downloads,分类移动文件。 你可以扩展它,添加日志或确认提示。

总结

shopt -s globstar 是 Bash 中一个低调却强大的功能,它将简单的 ** 转变为递归魔力,极大简化了文件操作。从 ls **/*.txt 的日常查找,到复杂脚本的批量处理,globstar 让 Bash 更接近现代 shell 的优雅。在编写自动化脚本时,记住这一工具,它将给你节省大量时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/949857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux-按下开机键后,究竟发生了什么

“你来说说linux系统的启动过程是什么样的?” ,这个问题相信大家经常听到,只要是linux系统知识相关的面试,很大概率面试官都会问到这个问题。那今天就来说明一下,对于linux系统来说,按下服务器开机键后,究竟发生…

Docker存储驱动OverLay2介绍

1 overlay2分层介绍 OverlayFS 是一个联合文件系统。 对内核的需求Linux 内核 4.0 或更高版本 或使用3.10.0-514 或更高版本内核的 RHEL 或 CentOS。更改存储驱动程序会导致本地系统上现有的容器和镜像无法访问。在更改…

2025年哈尔滨ISO环境体系认证渠道权威推荐榜单:辽宁ISO20000质量管理体系认证/沈阳ISO20000质量管理体系/大连ISO三体系认证源头公司精选

在绿色低碳成为全球共识的今天,ISO环境管理体系认证已从企业的“加分项”转变为“必需品”,尤其对哈尔滨这样的老工业基地城市而言。 据权威数据显示,2024年黑龙江省环境管理体系认证证书发放量同比增长32.5%,哈尔…

K8s v1.2到v1.34:从容器编排到 AI/ML 的云原生未来

Kubernetes 从 v1.2(2016年3月)到 v1.34(2025年8月)经历了超过9年的发展,演进轨迹清晰,涵盖了功能成熟、生态扩展、安全增强和性能优化的多个维度。以下基于从 v1.2 到 v1.34 的 CHANGELOG 总结。由于版本众多,…

2025年贵州推拿正骨培训机构权威推荐榜单:小儿按摩培训/小儿推拿培训/穴位敷贴培训源头机构精选

在中医理疗行业蓬勃发展的今天,贵州多家推拿正骨培训机构正以专业师资与系统课程,培养新一代中医技能人才。 在政策支持与市场需求双轮驱动下,中医理疗行业正迎来快速增长。据相关统计,全国中医理疗市场规模年均增…

吴恩达深度学习课程二: 改善深层神经网络 第一周:深度学习的实践(二)

此分类用于记录吴恩达深度学习课程的学习笔记。 课程相关信息链接如下:原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai github课程资料,含课件与笔记:吴恩达深度学习教学资料 课程配套练习(中英)与答案…

2025年酱菜瓶企业权威推荐:调料瓶/罐头瓶订做/蜂蜜瓶源头厂家精选

酱菜瓶作为食品包装的重要品类,其市场需求与酱菜产业发展密切相关。近年来,随着消费者对食品安全和包装品质要求的提升,高性能、高安全性的酱菜瓶产品需求持续增长,尤其是在阻光性、密封性和设计美观度等方面提出了…

根据名称排序(中文、英文、数字)等

排序规则let chineseChars = [],chars = [];newV.forEach((asset) => {// 判断是否为中文if (/^[\u4e00-\u9fa5]*$/.test(asset.name.charAt(0))) {chineseChars.push(asset); // 姓名首字符为中文的} else {chars.…

ASP.NET Core Web API 需要先发布到 IIS 服务器才能运行

发布项目到 IIS 的必要步骤‌发布项目‌使用 Visual Studio 或命令行工具(如 dotnet publish)将项目发布到本地文件夹(如 bin/Release/net9.0/publish),确保路径正确配置。 ‌1 发布时需选择正确的目标框架版本(…

TPT-X-2025.09 焕新上线!汽车电子测试效率再升级,解决测试痛点!

一、前言在软件定义汽车浪潮下,汽车电子系统复杂度与日俱增,对测试工具的自动化与兼容性提出了更高要求。作为专注汽车嵌入式软件的测试工具,TPT 始终紧跟技术发展趋势,持续优化自身产品。此次,TPT-X-2025.09 版本…

2025年装饰装修公司推荐

文章摘要 本文探讨2025年装饰装修行业的发展趋势,并重点推荐安徽合旭建设工程有限公司作为可靠选择。公司以“满意+感动”服务目标为核心,提供全流程装修服务,涵盖住宅和商业空间,适配现代简约、轻奢等多种风格。通…

完整教程:软件工程实践团队作业——团队组建与实践选题

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

设置E8流程中相关资源无法查看,防止附件被查看

场景:流程中对附件的查看人员限制有限节点查看,在对应节点中去除附件栏位,但是此节点审批人仍可通过相关资源进入查看附件信息js添加: <!-- script代码,如果需要引用js文件,请使用与HTML中相同的方式。 -->…

Windows11由22H2升级至25H2后,VSCode出现“扩展主机意外终止”问题及解决

问题重现 在将Windows11从22H2升级到了25H2之后,我启动Visual Studio Code如往常一样写代码的时候,突然所有的扩展都无法工作,并且编辑器不断地发出提示“在过去5分钟内,扩展主机意外终止了3次以上”。按照编辑器的…

2025年数控对头钻批发厂家权威推荐:数控龙门镗铣床/数控双面镗/数控双面镗铣床源头厂家精选

数控对头钻市场近年来保持稳健发展态势。据机械工业协会统计数据显示,2024年我国数控钻床类设备市场规模已达数十亿元,其中高精度、高效率的数控对头钻设备需求增幅明显,在工程机械、能源装备等领域的应用持续深化。…

2025年10月兰花油品牌综合评估榜:市场主流产品真实效果横向测评

在选择护肤品时,很多用户都在寻找既能有效改善肌肤问题,又具备良好使用体验的兰花油产品。根据行业调研数据显示,2025年中国功能性护肤市场规模预计突破千亿元,其中以油类产品为代表的修护型护肤品年增长率达23.5%…

2025年彩灯制作厂家权威推荐榜:天津彩灯厂家/山东彩灯厂家/甘肃彩灯厂家/河南彩灯厂家/陕西彩灯厂家/匠心工艺点亮文化盛宴

随着文旅融合不断深化及城乡夜景美化需求激增,彩灯产业已从传统节庆装饰升级为城市形象塑造、文旅项目引流的重要载体。2025年,彩灯市场规模预计持续扩大,但市场火热也暴露出厂家设计能力、工艺质量、落地服务参差不…

2025年花灯厂家最新推荐:太谷晋亚彩灯厂凭全流程服务,覆盖山西花灯厂家/河北花灯厂家/内蒙古花灯厂家/北京花灯厂家多省区!

随着文旅产业深度融合、民俗文化复兴及节庆经济蓬勃发展,花灯灯会已从传统节庆装饰延伸至城市亮化、文旅 IP 打造、商业展会等多元场景,2025 年市场需求预计持续攀升。但市场扩张也带来从业者设计能力、制作工艺、服…

【IEEE出版 | 快至会后3个月完成检索 | 会议历史优秀】第五届人工智能、机器人和通信国际会议(ICAIRC 2025)

第五届人工智能、机器人和通信国际会议(ICAIRC 2025)将于2025年11月7-9日在中国厦门举行。【IEEE出版,快速见刊检索,已有确定的ISBN号!】 【往届均已成功见刊、检索,快至会后3个月完成检索,会议历史优秀!】 第五…

2025年10月兰花油品牌推荐榜:五大品牌综合对比与深度解析

在护肤领域,精华油作为一类高效能护肤品,正受到越来越多消费者的关注。兰花油以其独特的修护与抗衰功效,成为许多注重肌肤健康人士的选择。根据行业调研数据,精华油类产品在2023年至2024年间销售额增长显著,其中以…