温馨提示×

debian readdir能过滤文件吗

小樊
52
2026-10-01 10:32:17
栏目: 智能运维

在 Debian(以及所有类 Unix 系统)里,readdir() 本身不能“过滤”文件,它只是逐个返回目录里的所有条目(包括文件、子目录、符号链接等)。

如果你想要“只读取某些文件”,一般有以下几种做法:


1. readdir() + 手动过滤(最常见)

在用户态判断文件名或类型:

#include <dirent.h>
#include <string.h>
#include <stdio.h>

int main() {
    DIR *dir = opendir(".");
    struct dirent *entry;

    while ((entry = readdir(dir)) != NULL) {
        if (strncmp(entry->d_name, ".", 1) == 0) // 跳过隐藏文件
            continue;
        if (entry->d_type == DT_REG)            // 只处理普通文件
            printf("%s\n", entry->d_name);
    }

    closedir(dir);
    return 0;
}

✅ readdir() 返回所有内容
❌ 过滤逻辑由你自己写


2. scandir()(带过滤函数)

这是 readdir 的“增强版”,支持过滤 + 排序:

#include <dirent.h>
#include <stdio.h>

int filter(const struct dirent *d) {
    return strncmp(d->d_name, ".", 1) != 0;
}

int main() {
    struct dirent **namelist;
    int n = scandir(".", &namelist, filter, alphasort);

    for (int i = 0; i < n; i++) {
        printf("%s\n", namelist[i]->d_name);
        free(namelist[i]);
    }
    free(namelist);
}

✅ 直接支持过滤函数
✅ 使用更方便


3. glob()(按通配符过滤)

适合“*.txt”这种需求:

#include <glob.h>
#include <stdio.h>

int main() {
    glob_t g;
    glob("*.txt", 0, NULL, &g);

    for (int i = 0; i < g.gl_pathc; i++)
        printf("%s\n", g.gl_pathv[i]);

    globfree(&g);
}

✅ 支持 shell 风格通配符
❌ 不是基于 readdir


4. 内核 / 文件系统层面?

不能在 readdir 系统调用层面直接过滤
(Linux 没有“只返回 .txt”的 readdir 接口)


总结

方法 是否能过滤 说明
readdir() ❌ 返回全部,自己过滤
scandir() ✅ 提供 filter 函数
glob() ✅ 通配符过滤
内核 ❌ 不支持

如果你能说下是 C / C++ / Shell / Python,我可以给你更具体的例子。

0 踩