我正在尝试实施一个"ls“,作为对基本培训的回归。我知道我可以使用opendir()
和readdir()
来做基本的清单。
对于排序,我别无选择,只能将每个条目添加到一个数组中,然后进行排序。对于过滤--或者全局--我假设我可以在我的代码中手动完成这个任务。但我正在寻找“不破坏磁盘”-让操作系统为我过滤这个。同时,过滤"$234*.a*“也不简单。
问:如何在一个好的老C目录中列出所有"*.txt“文件?(只有Unix/Posix,这是可以的)。
灵感来源:cmds.cpp#L656 https://github.com/mirror/busybox/blob/master/coreutils/ls.c#L1206
发布于 2020-11-13 13:12:28
对于过滤--或者全局--我假设我可以在我的代码中手动完成这个任务。
我如何列出所有的"*.txt“
*.txt
全局扩展是由您的shell作为文件名展开的一部分完成的,在执行ls
命令之前会将其分解成单独的参数。展开全局表达式不是ls
的一部分。在ls
中支持全球化将是一个非标准的扩展。
若要列出目录中的文件,请使用斯堪迪尔 (与alphasort
一起)。scandir
的一个完美例子是在linux手册页扫描中
#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“文件?
在手册中还有另一个例子。代码将非常简单:
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手册。
https://stackoverflow.com/questions/64821062
复制相似问题