发布
社区首页 >问答首页 >列出目录中的文件和筛选结果。

列出目录中的文件和筛选结果。
EN

Stack Overflow用户
提问于 2020-11-13 12:40:12
回答 1查看 414关注 0票数 0

我正在尝试实施一个"ls“,作为对基本培训的回归。我知道我可以使用opendir()readdir()来做基本的清单。

对于排序,我别无选择,只能将每个条目添加到一个数组中,然后进行排序。对于过滤--或者全局--我假设我可以在我的代码中手动完成这个任务。但我正在寻找“不破坏磁盘”-让操作系统为我过滤这个。同时,过滤"$234*.a*“也不简单。

问:如何在一个好的老C目录中列出所有"*.txt“文件?(只有Unix/Posix,这是可以的)。

灵感来源:cmds.cpp#L656 https://github.com/mirror/busybox/blob/master/coreutils/ls.c#L1206

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-13 13:12:28

对于过滤--或者全局--我假设我可以在我的代码中手动完成这个任务。

不要重新发明轮子-- 格罗布火柴虫草是标准的。

我如何列出所有的"*.txt“

*.txt全局扩展是由您的shell作为文件名展开的一部分完成的,在执行ls命令之前会将其分解成单独的参数。展开全局表达式不是ls的一部分。在ls中支持全球化将是一个非标准的扩展。

若要列出目录中的文件,请使用斯堪迪尔 (与alphasort一起)。scandir的一个完美例子是在linux手册页扫描

代码语言:javascript
代码运行次数:0
复制
   #define _DEFAULT_SOURCE
   #include <dirent.h>
   #include <stdio.h>
   #include <stdlib.h>

   int
   main(void)
   {
       struct dirent **namelist;
       int n;

       n = scandir(".", &namelist, NULL, alphasort);
       if (n == -1) {
           perror("scandir");
           exit(EXIT_FAILURE);
       }

       while (n--) {
           printf("%s\n", namelist[n]->d_name);
           free(namelist[n]);
       }
       free(namelist);

       exit(EXIT_SUCCESS);
   }

一个ls程序会对每个参数进行迭代,查看它是否是一个文件-如果是的话,用权限列出它(调用stat +格式化)。如果一个参数是dir -它将使用scandir,然后stat对每个文件+格式。注意,在某些情况下,ls输出格式实际上是指定的(但仍然给实现留下了很大的自由)。

如何在一个好的老C目录中列出所有"*.txt“文件?

手册中还有另一个例子。代码将非常简单:

代码语言:javascript
代码运行次数:0
复制
       glob_t globbuf = {0};
       glob("*.txt", 0, NULL, &globbuf);
       for (char **file = globbuf.gl_pathv; *file != NULL; ++file) { 
               printf("%s\n", *file);
       }
       globfree(&globbuf);

POSIX链接和linux手册页项目非常适合学习-linux手册页,它下面的SEE ALSO部分对于发现函数非常有用。也见GNU手册

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64821062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档