
glob函数在Linux/UNIX编程中尤为重要,尤其在shell脚本和C语言编程中,其应用广泛且高效
本文将详细解析Linux glob函数的参数及其使用,通过具体示例展示其强大的功能
glob函数的基本介绍 glob函数是一个用于文件系统中路径名称的模式匹配的函数
其原型如下: int glob(constchar pattern, int flags, int errfunc(constchar epath, int eerrno), glob_tpglob); - pattern:这是需要匹配的路径模式,可以使用通配符如、?和【】等
- flags:这是匹配选项的标志位,可以通过位或操作组合多个标志
- errfunc:这是一个错误处理函数的指针,当glob函数执行出错时,会调用此函数
其参数包括出错的路径和错误码
如果不关注错误处理,可以设置为NULL
- pglob:这是一个指向glob_t结构体的指针,用于存储匹配结果
glob_t结构体的定义如下: typedef struct{ size_tgl_pathc; // 匹配到的数量 chargl_pathv; // 匹配到的元素放在这里 size_tgl_offs; // 预留在gl_pathv中的空间数量 } glob_t; 在调用glob函数后,匹配到的路径数量会存储在gl_pathc成员中,匹配到的路径会以字符串数组的形式存储在gl_pathv中
glob函数的常用标志位 glob函数提供了多个标志位,以满足不同的匹配需求
以下是一些常用的标志位: 1.GLOB_NOCHECK:如果设置了此标志位,当传入的通配符表达式没有匹配到任何文件时,glob函数会将表达式本身作为匹配结果返回
而不是返回错误码GLOB_NOMATCH
这在某些情况下非常有用,例如当需要确保表达式本身被处理时
2.GLOB_APPEND:此标志位表示pglob已经包含了上次调用glob函数得到的结果,此次调用的结果会被追加在以前的结果后面
这对于匹配多个模式非常便捷
3.GLOB_NOESCAPE:默认情况下,如果、`?`、【前有一个字符,该通配符就被认为是一个普通字符,从而失去其通配符的意义
例如,模式`al仅会匹配名字为a`的文件
而如果指定了GLOB_NOESCAPE,字符会失去它的特殊意义,`al将匹配任何以a`开头的文件
4.GLOB_PERIOD:大多数shell都不允许匹配以.开头的文件(因为这些文件通常是隐藏文件或系统文件)
glob函数在一般情况下也是这样
但是如果指定了GLOB_PERIOD,以.开头的文件也可以参与匹配
5.GLOB_ERR:如果发生错误(如无法访问目录或无法读取文件),glob函数会设置GLOB_ERR标志,并返回一个非零值
这允许程序在出错时采取相应的处理措施
6.GLOB_MARK:如果匹配的路径名是一个目录,则在路径名后面添加一个斜杠`/`
这对于区分文件和目录非常有用
7.GLOB_NOSORT:不对匹配的路径名进行排序
默认情况下,glob函数会对匹配结果进行排序
如果不需要排序,可以设置此标志位以提高性能
8.GLOB_TILDE:在匹配时扩展波浪号~字符为用户的主目录路径
这对于处理用户主目录下的文件非常有用
glob函数的使用示例 以下是一些使用glob函数的示例代码,展示了如何使用不同的标志位和错误处理函数
示例1:打印指定路径下的所有.txt文件
include
示例2:处理匹配错误
include 然后,我们使用glob函数匹配`/etc`目录下以`a`开头、`.conf`结尾的文件,并打印出匹配到的文件路径
示例3:实现du命令
// 省略了部分代码,以展示关键部分
static int64_t mydu(constchar path) {
struct stat statres;
char nextpath【PATHSIZE】;
glob_t globres;
int err, i;
int64_t sum;
// 使用lstat函数获得文件(目录)属性
if(lstat(path, &statres) < 0) {
perror(lstat());
exit(1);
}
// 判断是否是目录,如果是则递归计算大小
if(S_ISDIR(statres.st_mode)){
strncpy(nextpath, path, PATHSIZE);
strncat(nextpath, /, PATHS
Hyper-V虚拟交换机使用指南
Linux glob参数:高效文件匹配秘籍
一键启用Hyper-V:详细命令教程
VDP、VMware与Veeam备份解决方案
Linux色码揭秘:打造炫酷终端界面
解锁VMware VCA认证:精选试题助你一次过关秘籍
Hyper-V虚拟交换机重置教程
Linux色码揭秘:打造炫酷终端界面
正版Linux教程:轻松入门学习指南
VMware虚拟环境下高效构建Linux系统教程
Linux 7系统路由配置全攻略
Linux C程序高效部署指南
Java在Linux下获取当前路径技巧
SCL Linux下载指南:轻松获取安装包
Linux Rlimits:深入探索资源限制管理
Intel Linux架构:性能优化与高效运算
路由侠Linux:高效网络路由管理指南
Linux网线红灯:故障排查与解决指南
Linux系统高效拉起进程技巧