glob宝刀不老

举报
黄生 发表于 2026/05/07 19:13:05 2026/05/07
【摘要】 我们会在AI Agent使用的工具里和CMakeLists.txt中看到glob,它干的是一件事:根据通配符模式来查找文件或目录。可以理解成一个聪明的"文件搜索助手",你告诉它一个模糊的规则(比如"所有以.txt结尾的文件"),它就能帮你把电脑里所有符合这个规则的文件都找出来。它最早来自Unix系统,是"global"(全局)的缩写。它使用一些特殊的符号(通配符)来模糊匹配文件名,规则很简单...

我们会在AI Agent使用的工具里和CMakeLists.txt中看到glob,它干的是一件事:根据通配符模式来查找文件或目录。可以理解成一个聪明的"文件搜索助手",你告诉它一个模糊的规则(比如"所有以.txt结尾的文件"),它就能帮你把电脑里所有符合这个规则的文件都找出来。它最早来自Unix系统,是"global"(全局)的缩写。

它使用一些特殊的符号(通配符)来模糊匹配文件名,规则很简单:

通配符 含义 举个例子
* 匹配任意个字符(包括零个) *.txt 会找到所有以.txt结尾的文件。
? 匹配单个字符 ?.jpg 会找到 1.jpg, a.jpg,但不会找到 12.jpg
[abc] 匹配方括号内的任意一个字符 file[0-9].log 会找到 file0.logfile9.log
** 匹配任意层级的子目录(递归) **/*.py 会找到当前文件夹及所有子文件夹下的所有Python文件。

一个关键区别:Glob模式和我们常听说的"正则表达式"不是一回事。Glob的规则更简单,主要用于匹配文件路径;而正则表达式则强大复杂得多,用于匹配文本内容。

在不同场景下的使用示例

1. 在Python中 (glob模块)

Python的glob模块能让你轻松获取一组文件列表。

import glob

# 1. 基本匹配:获取当前目录下所有 .txt 文件
txt_files = glob.glob("*.txt")
print(txt_files)  # 输出: ['1.txt', 'notes.txt', ...]

# 2. 递归匹配:获取 src 文件夹及其所有子文件夹下的 .js 文件
js_files = glob.glob("src/**/*.js", recursive=True)
print(js_files)  # 输出: ['src/main.js', 'src/utils/helper.js', ...]

2. 在CMake中 (file(GLOB)file(GLOB_RECURSE))

CMakeLists.txt里,GLOB也是用来批量获取源文件列表,避免手动一个个添加。

# 1. 仅当前目录:收集 src 文件夹下的所有 .c 文件
file(GLOB SOURCES "src/*.c")

# 2. 递归搜索:收集 lib 目录及其所有子文件夹下的 .cpp 文件
file(GLOB_RECURSE LIB_SOURCES "lib/*.cpp")

# 使用收集到的文件创建可执行文件
add_executable(my_app ${SOURCES} ${LIB_SOURCES})

💡 CMake使用提示:官方推荐手动列出源文件。如果用GLOB自动收集,当你添加或删除文件后,有时CMake可能察觉不到变化,导致编译出错。如果图方便要用,CMake 3.12+版本可以加上CONFIGURE_DEPENDS参数,让它在每次构建时自动检查变化。

最后说一下,在最早的Unix系统中,有一个叫/etc/glob的程序专门做通配符扩展,后来这个功能被内置到了Shell中,而"glob"这个称呼就一直沿用至今。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。