在日常的 Linux 系统运维和脚本编写中,我们经常需要批量处理文件,而 globstar 模式,配合 shopt -s globstar 命令,就能让 Bash Shell 拥有递归搜索文件的能力。它就像一个强大的文件搜索利器,能够帮助我们在复杂的目录结构中轻松找到目标文件。尤其是在处理大型项目,例如使用 Nginx 部署的 Web 应用,需要查找配置文件或者日志文件时,globstar 更是能大大提升效率。
问题场景重现:多层目录下的文件查找
假设我们有一个项目目录,结构如下:
project/
├── config/
│ ├── app.conf
│ └── database.conf
├── logs/
│ ├── access.log
│ └── error.log
└── scripts/
├── deploy.sh
└── utils.sh
现在,我们需要找到所有的 .conf 文件。如果没有 globstar,我们需要手动指定路径:
find . -name "*.conf"
但如果目录层级更深,这种方式就会变得非常繁琐。使用 shopt -s globstar 后,只需要一行命令:
shopt -s globstar # 启用 globstar 模式
echo **/*.conf # 递归查找所有 .conf 文件
底层原理深度剖析:Globbing 的奥秘
Globbing 是一种文件名模式匹配技术,允许使用通配符来匹配文件名。常见的通配符包括 *(匹配零个或多个字符)和 ?(匹配单个字符)。globstar 模式则扩展了 * 的能力,使其可以匹配零个或多个目录。shopt -s globstar 实际上是修改了 Bash Shell 的行为,使其在解析 ** 时,将其视为递归匹配目录。
当执行 echo **/*.conf 时,Bash Shell 会首先查找当前目录及其所有子目录下的 .conf 文件。它会将 ** 替换为所有可能的目录路径,然后对每个路径进行文件匹配。这个过程类似于深度优先搜索(DFS),遍历所有可能的目录路径。想象一下,如果使用宝塔面板管理 Nginx 网站,网站目录结构往往很深,globstar 就能高效找到特定配置文件。
代码/配置解决方案:从启用到使用
启用
globstar模式:在 Bash Shell 中,使用
shopt -s globstar命令启用globstar模式。要禁用,使用shopt -u globstar命令。shopt -s globstar # 启用 globstar递归查找文件:

使用
**通配符来递归匹配文件。例如,**/*.log匹配所有目录下的.log文件。echo **/*.log # 查找所有 .log 文件结合其他命令使用:
globstar可以与其他命令结合使用,例如ls、cp、rm等。可以批量处理文件。例如,删除所有目录下的.tmp文件:rm -rf **/*.tmp # 删除所有 .tmp 文件在脚本中使用:

在 Bash 脚本中,建议先检查
globstar模式是否已启用,如果未启用则启用它。这可以确保脚本在不同环境下都能正常运行。if ! shopt -q globstar; then shopt -s globstar # 启用 globstar (如果尚未启用) fi # 递归查找并打印所有 Markdown 文件 for file in **/*.md; do echo "Found Markdown file: $file" done
实战避坑经验总结:小心陷阱,避免踩坑
性能问题: 在大型目录结构中使用
globstar可能会导致性能问题。由于 Bash Shell 需要遍历所有可能的目录路径,因此搜索时间可能会很长。尤其是在 NAS 服务器上存储大量文件时,需要谨慎使用。文件名包含空格: 如果文件名包含空格,可能会导致
globstar无法正确匹配。可以使用引号将文件名括起来。循环引用: 如果目录结构中存在循环引用(例如,A 目录指向 B 目录,B 目录又指向 A 目录),
globstar可能会陷入无限循环。需要避免创建循环引用。
与 find 命令的比较:
globstar和find命令都可以用于查找文件,但它们的工作方式不同。globstar是 Bash Shell 内置的特性,而find是一个独立的命令。find命令功能更强大,可以根据文件类型、大小、修改时间等条件进行过滤,但使用起来也更复杂。在简单场景下,globstar更方便;在复杂场景下,find命令更适合。作用域问题
shopt命令设置的变量作用域仅限于当前 shell 会话。如果需要在多个脚本中启用 globstar,最好将shopt -s globstar放入~/.bashrc或~/.bash_profile中。
熟练掌握 shopt -s globstar 这一技巧,能让你在 Bash Shell 的世界里更加游刃有余,高效处理各种文件操作任务。
冠军资讯
程序猿老猫