在 CentOS(本质上是 Linux) 里,readdir() 本身不能过滤。
readdir() 的行为readdir()(来自 <dirent.h>)的作用是:
struct dirent *示例:
DIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 这里拿到的是所有文件/目录
}
常见做法有几种:
readdir() 后手动过滤(最常见)while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_REG) { // 只处理普通文件
printf("%s\n", entry->d_name);
}
}
glob()(按通配符过滤)适合 shell 风格过滤:
glob_t gl;
glob("/var/log/*.log", 0, NULL, &gl);
for (int i = 0; i < gl.gl_pathc; i++) {
printf("%s\n", gl.gl_pathv[i]);
}
scandir()(支持过滤函数)这是最接近“readdir 过滤”的方案:
struct dirent **namelist;
int n = scandir(".", &namelist, NULL, alphasort);
也可以自定义过滤函数:
int filter(const struct dirent *e) {
return strncmp(e->d_name, "test", 4) == 0;
}
find(非 C 程序)find /path -type f -name "*.log"
| 方式 | 是否过滤 | 说明 |
|---|---|---|
readdir() |
❌ | 不过滤,只能手动判断 |
scandir() |
✅ | 支持过滤函数 |
glob() |
✅ | 通配符过滤 |
find |
✅ | 命令行最方便 |
如果你说的是 某个具体语言(Python / C++ / shell) 或 特定过滤条件(后缀 / 类型 / 权限),可以告诉我,我给你具体示例。