iNu*_*ste 3 c unix linux glob path
基本上,到目前为止我有这个代码:
#include <glob.h>
#include <string.h>
#include <stdio.h>
# define ERROR 1
# define FAILURE -1
int main(int ac, char **av)
{
glob_t globlist;
int i;
i = 0;
if (ac == 1)
return (-1);
else
{
if (glob(av[1], GLOB_PERIOD, NULL, &globlist) == GLOB_NOSPACE
|| glob(av[1], GLOB_PERIOD, NULL, &globlist) == GLOB_NOMATCH)
return (FAILURE);
if (glob(av[1], GLOB_PERIOD, NULL, &globlist) == GLOB_ABORTED)
return (ERROR);
while (globlist.gl_pathv[i])
{
printf("%s\n", globlist.gl_pathv[i]);
i++;
}
}
return (0);
}
Run Code Online (Sandbox Code Playgroud)
例如,当我键入时./a.out "*",它会打印我所在的所有文件以及目录,但不会打印目录内的内容。我应该如何打印所有文件,包括子文件/文件夹?
谢谢
如果您想检查整个树而不是一个特定的路径和文件名模式,请使用nftw()而不是。glob()
(通过使用 opendir()/readdir()/filledir() 来重新发明轮子绝对是愚蠢的,特别是因为 nftw() 应该优雅地处理文件系统更改,而自旋转树遍历代码通常会忽略所有困难的东西,并且只能在您自己的机器上在最佳条件下工作,而在其他地方则以惊人而美妙的方式失败。)
在过滤器函数中,fnmatch()使用 glob 模式来决定文件名是否可接受。
如果您希望使用正则表达式进行过滤,请regcomp()在调用 nftw() 之前编译模式,然后regexec()在过滤器函数中进行编译。(正则表达式比 glob 模式更强大,并且它们被编译为紧密的状态机,因此它们也非常高效。)
如果您不确定其中的区别,维基百科有关全局模式和正则表达式的文章非常有用且内容丰富。
以上所有内容均在 POSIX.1-2008 中定义,因此它们可以跨所有 POSIX-y 操作系统移植。