Shell 中的 Globbing:原理、使用方法与实现解析(中英双语)
Shell 中的 Globbing:原理、使用方法与实现解析
在 Unix Shell(如 Bash、Zsh)中,globbing 是指 文件名模式匹配(filename pattern matching),它允许用户使用特殊的通配符(wildcards)来匹配多个文件,而不需要手动列出所有文件名。这一功能是 Shell 解析命令时的一个重要步骤,极大地提高了命令行操作的灵活性。
1. 什么是 Globbing?
Globbing 是 Shell 解释用户输入的命令时,将包含通配符的模式 扩展为符合匹配规则的文件名列表 的过程。例如:
ls *.txt
在执行 ls *.txt 时,Shell 不会将 *.txt 直接传递给 ls,而是会 先解析 *.txt 并匹配当前目录下的所有 .txt 文件,然后把结果传递给 ls 命令。例如,当前目录下有:
file1.txt file2.txt file3.log
则:
ls *.txt
实际上等价于:
ls file1.txt file2.txt
其中 file3.log 因不符合 *.txt 的模式匹配规则而被排除。
2. Globbing 的常见通配符
Shell 的 globbing 机制支持多种 通配符(wildcards),常见的有以下几种:
| 通配符 | 作用 | 示例 | 匹配内容 |
|---|---|---|---|
* | 匹配 任意数量 的字符(包括 0 个字符) | *.txt | a.txt、b.txt、test.txt |
? | 匹配 任意单个字符 | file?.txt | file1.txt、file2.txt,但不匹配 file10.txt |
[abc] | 匹配 [] 内的 任意一个字符 | file[12].txt | file1.txt、file2.txt |
[a-z] | 匹配 某个范围内的字符 | file[a-z].txt | filea.txt、fileb.txt |
{a,b,c} | 匹配 逗号分隔的任意一个模式 | file{1,2,3}.txt | file1.txt、file2.txt、file3.txt |
** (仅 Bash 4.0+) | 递归匹配所有子目录 | **/*.txt | 匹配当前目录及所有子目录中的 .txt 文件 |
3. Globbing 的执行流程
在 Shell 处理用户输入的命令时,globbing 是命令解析(parsing)过程中的一个步骤。执行流程如下:
- 用户输入命令(例如
ls *.txt)。 - Shell 解析命令:
- 如果命令行包含通配符(如
*),Shell 进入 globbing 处理。 - Shell 读取当前目录下的文件列表,并 匹配符合规则的文件名。
- 如果命令行包含通配符(如
- Shell 替换通配符模式:
*.txt被替换为所有匹配的文件名,如file1.txt file2.txt。
- Shell 执行最终命令:
ls file1.txt file2.txt
注意:如果没有任何文件匹配通配符模式,大多数 Shell 会直接返回原始模式,如:
echo *.xyz如果
*.xyz没有匹配的文件,Bash 会直接输出*.xyz,而不会报错。
4. Globbing 与 正则表达式 的区别
Globbing 并不是正则表达式,它们有以下主要区别:
| 特性 | Globbing | 正则表达式 |
|---|---|---|
| 作用 | 文件名匹配 | 处理文本模式匹配 |
* 含义 | 匹配 任意字符(包括空字符) | 匹配 前一个字符 0 次或多次 |
? 含义 | 匹配 任意单个字符 | 匹配 前一个字符 0 或 1 次 |
. 含义 | 作为普通字符匹配 | 代表 任意单个字符 |
示例:
ls *.txt # 使用 globbing,匹配所有 .txt 结尾的文件
grep 'a.*b' file.txt # 使用正则表达式,匹配 'a' 到 'b' 之间的任何字符
5. 禁用 Globbing
有时候,我们希望 Shell 不要 自动展开通配符,而是让命令接收到原始的 * 或 ? 等字符。可以使用以下方法:
- 使用单引号
''echo '*.txt' # 输出 *.txt,而不是匹配的文件列表 - 使用
set -f关闭 globbingset -f echo *.txt # 直接输出 *.txt set +f # 重新开启 globbing
6. Shell 中的 Globbing 实现
Globbing 在 Shell 内部是如何实现的呢?主要分为以下几步:
- 读取命令:Shell 读取用户输入的命令字符串。
- 解析通配符:
- 遍历当前目录文件列表。
- 依次对文件名进行 模式匹配(Pattern Matching)。
- 使用 字符串匹配算法 进行匹配,如:
*进行贪心匹配(Greedy Match)。?进行单字符匹配。[a-z]进行范围匹配。
- 替换匹配项:
- 匹配的文件列表替换原始通配符字符串。
- 执行命令:Shell 执行替换后的命令。
Shell 通常使用 系统调用 opendir() 和 readdir() 访问目录并进行匹配。
7. 编写 C 代码实现简单的 Globbing
下面是一个使用 fnmatch() 函数进行 Shell 风格模式匹配的 C 代码示例:
具体原理和代码解析请看笔者的另一篇博客: 深入解析 fnmatch():C 语言中的模式匹配函数(中英双语)
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <fnmatch.h>void list_matching_files(const char *pattern) {struct dirent *entry;DIR *dir = opendir(".");if (!dir) {perror("opendir");return;}while ((entry = readdir(dir)) != NULL) {if (fnmatch(pattern, entry->d_name, 0) == 0) {printf("%s\n", entry->d_name);}}closedir(dir);
}int main() {list_matching_files("*.c"); // 匹配当前目录下的所有 .c 文件return 0;
}
运行示例:
$ gcc globbing.c -o globbing
$ ./globbing
main.c
utils.c
shell.c
8. 结论
Globbing 是 Shell 解析命令的重要步骤,主要用于 文件名匹配,其实现涉及 字符串匹配算法、系统目录读取 等技术。用户可以利用 通配符 灵活地批量操作文件,但要注意它与 正则表达式 的区别。此外,用户可以通过 单引号 或 set -f 禁用 Globbing,使 Shell 直接传递原始字符串。理解 Globbing 的原理可以帮助我们更高效地使用 Shell 命令,提高自动化任务的执行效率。
这篇博客详细介绍了 Globbing 的概念、用法、实现原理、C 代码示例,希望能帮助你更深入地理解这个 Shell 机制! 🚀
Shell Globbing: Principles, Usage, and Implementation
Globbing in Unix Shell (such as Bash, Zsh) refers to filename pattern matching, where users can use special wildcard characters to match multiple files without manually listing their names. This feature enhances the flexibility of command-line operations.
1. What is Globbing?
Globbing is the process where the Shell expands wildcard patterns into matching filenames before executing a command.
For example, consider the command:
ls *.txt
Instead of passing *.txt as an argument to ls, the Shell first expands the pattern by searching for files in the current directory that match the pattern. If the directory contains:
file1.txt file2.txt file3.log
then the command:
ls *.txt
is actually executed as:
ls file1.txt file2.txt
while file3.log is ignored because it does not match *.txt.
2. Common Wildcards in Globbing
Shell globbing supports several wildcards for flexible pattern matching:
| Wildcard | Description | Example | Matches |
|---|---|---|---|
* | Matches any number of characters (including none) | *.txt | a.txt, b.txt, test.txt |
? | Matches any single character | file?.txt | file1.txt, file2.txt (not file10.txt) |
[abc] | Matches any single character in brackets | file[12].txt | file1.txt, file2.txt |
[a-z] | Matches any character in the range | file[a-z].txt | filea.txt, fileb.txt |
{a,b,c} | Matches any of the comma-separated patterns | file{1,2,3}.txt | file1.txt, file2.txt, file3.txt |
** (Bash 4.0+) | Recursively matches files in subdirectories | **/*.txt | All .txt files in the directory tree |
3. How Globbing Works Internally
When a user enters a command, Shell processing follows these steps:
- User inputs a command (e.g.,
ls *.txt). - Shell scans for wildcards:
- If a command argument contains a wildcard (
*,?, etc.), Shell performs globbing. - It retrieves the list of files in the current directory.
- It matches filenames against the pattern.
- If a command argument contains a wildcard (
- Shell replaces the pattern with matching filenames:
- If
*.txtmatchesfile1.txt file2.txt, the final command becomes:ls file1.txt file2.txt
- If
- Shell executes the command.
Note: If no files match, some shells return the original pattern (e.g.,
echo *.xyzoutputs*.xyz).
4. Difference Between Globbing and Regular Expressions
Globbing is not the same as regular expressions. Key differences:
| Feature | Globbing | Regular Expressions |
|---|---|---|
| Purpose | Matches filenames | Matches text patterns |
* | Matches any characters | Matches previous character zero or more times |
? | Matches one character | Matches previous character zero or one time |
. | Treated as a normal character | Matches any character |
Example:
ls *.txt # Uses globbing to list all .txt files
grep 'a.*b' file.txt # Uses regex to match 'a' followed by 'b'
5. Disabling Globbing
To prevent Shell from expanding wildcards, use:
- Single quotes (
''):echo '*.txt' # Outputs *.txt without expansion - Disable globbing with
set -f:set -f echo *.txt # Outputs *.txt set +f # Re-enables globbing
6. How Globbing is Implemented in Shell
Internally, globbing is handled in these steps:
- Shell reads the command string.
- Pattern matching against directory contents:
- It retrieves files using system calls like
opendir()andreaddir(). - It applies pattern matching algorithms.
- It retrieves files using system calls like
- Matches are substituted before executing the command.
7. Implementing Globbing in C
The following C program demonstrates pattern matching using fnmatch(), which applies glob-style matching:
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <fnmatch.h>void list_matching_files(const char *pattern) {struct dirent *entry;DIR *dir = opendir(".");if (!dir) {perror("opendir");return;}while ((entry = readdir(dir)) != NULL) {if (fnmatch(pattern, entry->d_name, 0) == 0) {printf("%s\n", entry->d_name);}}closedir(dir);
}int main() {list_matching_files("*.c"); // Matches all `.c` files in the directoryreturn 0;
}
Example Output
If the directory contains main.c utils.c shell.c, running:
$ gcc globbing.c -o globbing
$ ./globbing
main.c
utils.c
shell.c
8. Conclusion
Globbing is a key feature of Shell parsing, allowing users to efficiently match filenames using wildcards. It differs from regular expressions and is processed before executing commands. Understanding globbing helps users write more efficient command-line operations and scripts. It is implemented at the Shell level using directory scanning and pattern matching algorithms.
Mastering globbing enables more effective batch file operations, automation, and scripting in Unix-based systems! 🚀
后记
2025年2月4日于山东日照。在GPT4o大模型辅助下完成。
相关文章:
Shell 中的 Globbing:原理、使用方法与实现解析(中英双语)
Shell 中的 Globbing:原理、使用方法与实现解析 在 Unix Shell(如 Bash、Zsh)中,globbing 是指 文件名模式匹配(filename pattern matching),它允许用户使用特殊的通配符(wildcards…...
互联网行业常用12个数据分析指标和八大模型
本文目录 前言 一、互联网线上业务数据分析的12个指标 1. 用户数据(4个) (1) 存量(DAU/MAU) (2) 新增用户 (3) 健康程度(留存率) (4) 渠道来源 2. 用户行为数据(4个) (1) 次数/频率…...
Leetcode 3443. Maximum Manhattan Distance After K Changes
Leetcode 3443. Maximum Manhattan Distance After K Changes 1. 解题思路2. 代码实现 题目链接:3443. Maximum Manhattan Distance After K Changes 1. 解题思路 这一题思路上算是一个类似滑动窗口的思路,核心思想就是在每一步走到的位置上考虑如何通…...
使用 Ollama 在 Windows 环境部署 DeepSeek 大模型实战指南
文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来,大语言模型(LLM)的应用逐渐成为技术热点,而 DeepSeek 作为国产开…...
新春贺岁,共赴AGI之旅
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 往期精彩文章推荐 季姮教授独家文字版干货 | 面向知识渊博的大语言模型 关于AI TIME AI TIME源起于2019年,旨在发扬科学思辨精神,邀请各界人士对人工智能理论、算法和场景应用的本质问题…...
C_位运算符及其在单片机寄存器的操作
C语言的位运算符用于直接操作二进制位,本篇简单结束各个位运算符的作业及其在操作寄存器的应用场景。 一、位运算符的简单说明 1、按位与运算符(&) 功能:按位与运算符对两个操作数的每一位执行与操作。如果两个对应的二进制…...
Java面试题集合篇5:10道基础面试题
文章目录 前言41、多线程使用 ArrayList42、List 和 Set 区别43、HashSet 实现原理44、HashSet检查重复和保证数据不可重复45、BlockingQueue46、Map接口46.1、HashMap实现原理46.2、HashMap在JDK1.7和JDK1.8中不同点46.3、JDK1.7 VS JDK1.8 比较 47、HashMap的put方法流程48、…...
汽车加气站操作工试题及答案
1.天然气的主要成分是( ) A. 乙烷 B. 乙烯 C. 甲烷 D. 乙炔 答案:C 2.加气站中,用来储存天然气的设备是( ) A. 加气机 B. 压缩机 C. 储气井 D. 脱水装置 答案:C 3.以下哪…...
Rust错误处理:从灭火器到核按钮的生存指南
开篇:错误处理的生存哲学 在Rust的平行宇宙里,错误分为两种人格: panic! → 核按钮💣(不可恢复,全系统警报)Result → 灭火器🧯(可控制,局部处理࿰…...
企业四要素如何用PHP进行调用
一、什么是企业四要素? 企业四要素接口是在企业三要素(企业名称、统一社会信用代码、法定代表人姓名)的基础上,增加了一个关键要素,通常是企业注册号或企业银行账户信息。这种接口主要用于更全面的企业信息验证&#x…...
【大数据技术】搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn)
搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) jdk-8u361-linux-x64.tarhadoop-3.3.6.tar.gz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群Hadoop+MapReduce+Yarn的详细步骤。 注意: 统一约定将软件安装包存放…...
【MySQL】MySQL经典面试题深度解析
文章目录 一、MySQL与C的深度结合1.1 为什么C项目需要MySQL?1.2 典型应用场景 二、基础概念面试题精讲2.1 存储引擎对比2.2 索引原理 三、C专项面试题解析3.1 连接池实现3.2 预处理语句3.3 批量操作优化 四、高级应用面试题剖析4.1 事务隔离级别4.2 锁机制详解4.3 查…...
GitHub Copilot 越狱漏洞
研究人员发现了两种操控 GitHub 的人工智能(AI)编码助手 Copilot 的新方法,这使得人们能够绕过安全限制和订阅费用、训练恶意模型等。 第一种技巧是将聊天交互嵌入 Copilot 代码中,利用 AI 的问答能力,使其产生恶意输…...
React组件开发技巧:如何优雅地传递Props?
React组件开发技巧:如何优雅地传递Props? 一、重复Props传递的痛点二、JSX展开语法的优雅解决方案语法解析适用场景 三、使用展开语法的注意事项1. **可读性风险**2. **Props冲突问题**3. **过度使用展开语法** 四、实际项目中的最佳实践五、总结六、扩展…...
Flask+gevent 实现异步请求处理
Flaskgevent 实现异步请求处理 使用flaskgevent实现异步请求处理,首先gevent库要使用猴子布丁,使底层I/O支持异步处理。 1 使用猴子补丁 from gevent import monkey monkey.patch_all()使用猴子补丁后, 内建函数time.sleep()已经魔改成gev…...
Python利用VideoCapture和FFmpeg读取多个rtsp流性能的比较
最近一个项目,要用python读取30个海康摄像头的rtsp流,一开始直接用cv2.VideoCapture(video_path),结果运行一段时间后发现读出来的frame经常出现花屏的现象。所以通过两种方式对程序进行了修改。 1、我先是通过cap.set(cv2.CAP_PROP_BUFFERS…...
Selenium 浏览器操作与使用技巧——详细解析(Java版)
目录 一、浏览器及窗口操作 二、键盘与鼠标操作 三、勾选复选框 四、多层框架/窗口定位 五、操作下拉框 六、上传文件操作 七、处理弹窗与 alert 八、处理动态元素 九、使用 Selenium 进行网站监控 前言 Selenium 是一款非常强大的 Web 自动化测试工具,能够…...
git 项目的更新
更新项目 当自己的本地项目与 远程的github 的仓库已经建立远程连接时, 则直接按照下面的步骤, 将本地的项目代码更新到远程仓库。 # Stage the resolved file git add README.md <file1> <file2># To stage all changes: git add .# Comm…...
UE虚幻引擎No Google Play Store Key:No OBB found报错如何处理
UE虚幻引擎No Google Play Store Key:No OBB found报错如何处理? 问题描述: UE成功打包APK并安装过后,启动应用时提示: No Google Play Store KeyNo OBB found and no store key to try to download. Please setone …...
吴恩达深度学习——卷积神经网络实例分析
内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 LeNet-5AlexNetVGG-16ResNets残差块 1*1卷积 LeNet-5 输入层:输入为一张尺寸是 32 32 1 32321 32321的图像,其中 32 32 3232 3232是图像的长和宽&…...
LabVIEW的智能电源远程监控系统开发
在工业自动化与测试领域,电源设备的精准控制与远程管理是保障系统稳定运行的核心需求。传统电源管理依赖本地手动操作,存在响应滞后、参数调节效率低、无法实时监控等问题。通过集成工业物联网(IIoT)技术,实现电源设备…...
【自动化办公】批量图片PDF自定义指定多个区域识别重命名,批量识别铁路货物运单区域内容改名,基于WPF和飞桨ocr深度学习模型的解决方案
项目背景介绍 铁路货运企业需要对物流单进行长期存档,以便后续查询和审计。不同的物流单可能包含不同的关键信息,通过自定义指定多个区域进行识别重命名,可以使存档的图片文件名具有统一的规范和明确的含义。比如,将包含货物运单…...
neo4j-在Linux中安装neo4j
目录 切换jdk 安装neo4j 配置neo4j以便其他电脑可以访问 切换jdk 因为我安装的jdk是1.8版本的,而我安装的neo4j版本为5.15,Neo4j Community 5.15.0 不支持 Java 1.8,它要求 Java 17 或更高版本。 所以我需要升级Java到17 安装 OpenJDK 17 sudo yu…...
专业学习|通过案例了解蒙特卡罗模拟实操步骤与含义
一、蒙特卡罗模拟介绍 蒙特卡罗模拟(Monte Carlo Simulation)是一种基于随机采样的数值计算方法,用于解决具有不确定性或复杂概率分布的问题。其核心思想是通过多次随机抽样来逼近系统的行为或目标函数的真实值,进而对系统进行评估…...
数据结构【链栈】
基于 C 实现链表栈:原理、代码与应用 一、引言 栈就是一个容器,可以当场一个盒子,只能一个一个拿,一个一个放,而且是从上面放入。 有序顺序栈操作比较容易【会了链栈之后顺序栈自然明白】,所以我们这里只…...
《数据可视化新高度:Graphy的AI协作变革》
在数据洪流奔涌的时代,企业面临的挑战不再仅仅是数据的收集,更在于如何高效地将数据转化为洞察,助力决策。Graphy作为一款前沿的数据可视化工具,凭借AI赋能的团队协作功能,为企业打开了数据协作新局面,重新…...
rust安装笔记
安装笔记 安装加速cargo 国内源nightly版本安装其他目标将现有项目迁移到新版本升级 安装加速 export RUSTUP_UPDATE_ROOT"https://mirrors.ustc.edu.cn/rust-static/rustup" export RUSTUP_DIST_SERVERhttps://mirrors.tuna.tsinghua.edu.cn/rustup curl --proto h…...
人工智能|本地部署|ollama+chatbox快速Windows10下部署(初级篇)
一、 前言: 其实早一个月我已经使用过deepseek,并且也在自己的机器上通过ollama部署过,但一直没有太多动力,现在感觉还是的记录一下,省的自己给忘掉了 本文只是简单记录一下ollamaopen-webuichatbox部署通过网盘分享…...
Android Studio 下载安装教程(2024 更新版),附详细图文
今天,为大家带来的是Android Studio 2024更新版的下载安装教程,包含详细图文步骤。 随着 Android Studio 的不断更新,自从引入 Koala 系列后,其版本号的命名规则也发生了变化。以本次更新为例,版本号为 2024.2.1&#…...
【人工智能】通用人工智能 AGI
AGI 是 Artificial General Intelligence 的缩写,中文翻译为通用人工智能。与我们常见的**特定人工智能(Narrow AI)**不同,AGI 是一个更高深、更具野心的目标。 AGI(人工通用智能)的定义 通用人工智能&am…...
