linuxglob函数详解致敬最美劳动者短句
glob库函数⽤于Linux⽂件系统路径名称的模式匹配,即查⽂件系统中指定模式的路径。注意,这不是正则表达式匹配,虽然有些相似,但还是有点差别。
glob函数原型
#include <glob.h>
int glob(const char *pattern, int flags,
int errfunc(const char *epath, int eerrno),
glob_t *pglob);
glob函数搜索匹配函数pattern中的参数,如/*是匹配根⽂件下的所有⽂件(不包括隐藏⽂件,要的隐藏⽂件需要从新匹配),然后会将匹配出的结果存放到 pglob,即第4个参数中,第⼆个参数能选择匹配模式,如是否排序,或者在函数第⼆次调⽤时,是否将匹配的内容追加到pglob中,等,第3个参数是查看错误信息⽤,⼀般置为NULL;
具体可以在终端下输⼊ man glob
实例1:
1  #include <stdio.h>
2  #include <glob.h>
3
4int main(int argc, const char *argv[])
5 {
6    glob_t buf;
7int i;
8      glob("/dev/*",GLOB_NOSORT, NULL, &buf);
9
10for(i=0; i < buf.gl_pathc; i++)
11    {
12          printf("buf.gl_pathv[%d]= %s \n", i, (buf.gl_pathv[i]));
13    }
14数的发展史
15    globfree(&buf);
16return0;
17 }
18
实例2:
在linux编程中,有时候会⽤到批量处理⽂件。⽐如写⼀个上传⼯具,⽤户输⼊⽂件名,如果此时⽤户使⽤的是匹配的⽂件名,那么程序应该做到根据匹配字符串⾃动搜索符合要求的⽂件名的功能。
linux有⼀个glob函数,可以做到这⼀点,该函数位于头⽂件glob.h中
事例:
1 #include <iostream>
2
3 #include <string>
4
5 #include <glob.h>
6
6
7using namespace std;
8
9
10
11void print_gl(glob_t &gl)
12
13{
14
15for(int i=0;i<gl.gl_pathc;i++)
16
辽宁移动17        {
18
19                cout<<gl.gl_pathv[i]<<endl;
20
21        }
22
23}
24
25
26
27void test_glob(int argc , char **argv)
28
29{
30
31        glob_t gl;
32
33for(int i=1;i<argc;i++)
34
35        {
36
37                gl.gl_offs=0;
38
39                glob(argv[i],GLOB_TILDE,0,&gl); 40
41                print_gl(gl);
42
43                globfree(&gl);
44
45        }
46
47 }
48
49
50
51int main(int argc,char **argv)
52
53{
54
55if(argc<2)
56
57        {
57        {
58
59                cout<<"<file name>"<<endl; 60
61return0;
62
63        }
64
65
66
67        test_glob(argc,argv);
68
69return0;
70
71 }
实例3:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include <glob.h>
6
7static int test_fun(int, char *[]);
8static void print_gl(glob_t *);
9
10int main(int argc, char *argv[])
11{
12if(argc > 1)
13        test_fun(argc, argv);艾尚真比基尼凸点
14else
15        printf("./mytest {/"path list/"}/n");
范伟主演的电视剧
16return0;
17}
18
19static int test_fun(int argc, char *argv[])
20{
21    glob_t gl;
22for(int i = 1; i < argc; ++i) {
23        gl.gl_offs = 0;
24        glob(argv[i], GLOB_TILDE, 0, &gl);
25        print_gl(&gl);
26        globfree(&gl);
27    }
28return0;
29}
30
31static void print_gl(glob_t *gl)
32{
33for(unsigned int i = 0; i < gl->gl_pathc; ++i)
34        printf("%s/n", gl->gl_pathv[i]);
35    printf("++++++++++++++++++++++/n");
36 }
编译:
gcc -std=c99 -g -W -Wall -Wextra -o mytest main.c
执⾏⽰例:
./mytest "./*.cpp" "./*.h" "./make*" "~/p*/p?ng"
注意:上诉命令中引号是必需的,否则shell会将模式展开!
实例4:
⽤glob的递归调⽤可以到系统任意路径的所有⽂件。如下例⼦:
1 #include <stdio.h>
2 #include <glob.h>
2 #include <glob.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <unistd.h>
8
9static int OpenDir(const char *buf)
iphone以旧换新10{
11int ret;
12char path[50] = {0};
13char temp[50] = {0};
14char *tp = NULL;
15        glob_t globbuf;
16struct stat fileinfo;
17int i;
18char *ptr = NULL,*last_ptr = NULL;
19        strcpy(path,buf);
20if(buf[strlen(buf)- 1] == '/')
21                strcat(path,"*");
22else
23                strcat(path,"/*");
24if((ret = glob(path,GLOB_NOSORT,NULL,&globbuf)) != 0){ 25if(GLOB_NOMATCH == ret)
26return0;
27else
28return -1;
29        }
30        strcpy(path,buf);
31if(buf[strlen(buf)- 1] == '/')
32                strcat(path,".*");
33else
34                strcat(path,"/.*");
35
36if((ret = glob(path,GLOB_APPEND,NULL,&globbuf)) != 0){ 37if(GLOB_NOMATCH == ret)
38return0;
39else
40return -1;
41        }
42for(i = 0;i < globbuf.gl_pathc;i++){
43                ret = lstat(globbuf.gl_pathv[i],&fileinfo);
44if(ret != 0){
45                        perror("lstat()");
46return -1;
47                }
48if(1 == S_ISDIR(fileinfo.st_mode)){
49                        printf("\n%s is directory!\n",globbuf.gl_pathv[i]);
50                        strcpy(temp,globbuf.gl_pathv[i]);
51                        tp = temp;
52while((last_ptr = strsep(&tp,"/")) != NULL){
53                                ptr = last_ptr;