温馨提示×

centos readdir能过滤吗

小樊
45
2026-09-09 04:53:40
栏目: 智能运维

在 CentOS(本质上是 Linux) 里,readdir() 本身不能过滤。

1. readdir() 的行为

readdir()(来自 <dirent.h>)的作用是:

  • 逐个读取目录中的 所有条目
  • 返回 struct dirent *
  • 不会根据条件过滤

示例:

DIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
    // 这里拿到的是所有文件/目录
}

2. 如何在 CentOS 上“过滤”

常见做法有几种:

✅ 方法一:在 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;
}

✅ 方法四:shell + find(非 C 程序)

find /path -type f -name "*.log"

3. 总结

方式 是否过滤 说明
readdir() ❌ 不过滤,只能手动判断
scandir() ✅ 支持过滤函数
glob() ✅ 通配符过滤
find ✅ 命令行最方便

如果你说的是 某个具体语言(Python / C++ / shell) 或 特定过滤条件(后缀 / 类型 / 权限),可以告诉我,我给你具体示例。

0 踩