温馨提示×

linux readdir怎么过滤

小樊
39
2026-09-08 15:41:29
栏目: 智能运维

在 Linux 下使用 readdir()(来自 <dirent.h>)读取目录时,readdir 本身不会过滤,需要你在代码里手动判断。下面按常见需求给你几种“过滤”方式。


一、基本用法(不过滤)

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

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

    while ((entry = readdir(dir)) != NULL) {
        printf("%s\n", entry->d_name);
    }

    closedir(dir);
    return 0;
}

二、常见过滤方式

1️⃣ 过滤掉 ...

while ((entry = readdir(dir)) != NULL) {
    if (strcmp(entry->d_name, ".") == 0 ||
        strcmp(entry->d_name, "..") == 0)
        continue;

    printf("%s\n", entry->d_name);
}

2️⃣ 按文件类型过滤(推荐)

使用 entry->d_type

类型
普通文件 DT_REG
目录 DT_DIR
符号链接 DT_LNK
while ((entry = readdir(dir)) != NULL) {
    if (entry->d_type == DT_REG) {
        printf("文件: %s\n", entry->d_name);
    }
}

⚠️ 注意:
某些文件系统(如 NFS)d_type 可能是 DT_UNKNOWN,此时需用 stat()


3️⃣ 使用 stat() 精确过滤(最可靠)

#include <sys/stat.h>

struct stat st;
char path[256];

while ((entry = readdir(dir)) != NULL) {
    snprintf(path, sizeof(path), "./%s", entry->d_name);
    stat(path, &st);

    if (S_ISREG(st.st_mode)) {
        printf("普通文件: %s\n", entry->d_name);
    }
}

4️⃣ 按文件名后缀过滤

while ((entry = readdir(dir)) != NULL) {
    if (strstr(entry->d_name, ".txt"))
        printf("%s\n", entry->d_name);
}

5️⃣ 按正则表达式过滤(高级)

可用 regex.h

#include <regex.h>

regex_t reg;
regcomp(&reg, ".*\\.log$", REG_EXTENDED);

while ((entry = readdir(dir)) != NULL) {
    if (!regexec(&reg, entry->d_name, 0, NULL, 0))
        printf("%s\n", entry->d_name);
}

regfree(&reg);

三、简单总结

需求 方法
跳过 . .. 字符串比较
文件 / 目录 d_type
精确类型 stat()
文件名规则 strstr / regex

如果你有 具体过滤条件(比如“只要 .c 文件”“排除隐藏文件”“递归子目录”),可以直接告诉我,我给你写完整示例。

0