温馨提示×

debian readdir如何过滤

小樊
46
2026-09-04 11:55:32
栏目: 智能运维

在 Debian(实际上是 Linux 下 C/C++ 编程)里,readdir 本身不会帮你过滤,它只是把目录里的每一个条目读出来。
过滤要在你自己的代码里做。下面按常见场景说明。


一、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 (strncmp(entry->d_name, ".", 1) == 0)
        continue; // 跳过隐藏文件

    if (strstr(entry->d_name, ".txt"))
        printf("%s\n", entry->d_name);
}

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

用 entry->d_type

while ((entry = readdir(dir)) != NULL) {
    if (entry->d_type == DT_REG) // 普通文件
        printf("文件: %s\n", entry->d_name);
    else if (entry->d_type == DT_DIR) // 目录
        printf("目录: %s\n", entry->d_name);
}

常见类型:

  • DT_REG 普通文件
  • DT_DIR 目录
  • DT_LNK 符号链接
  • DT_UNKNOWN 未知(需 stat)

⚠️ 某些文件系统 d_type 可能是 DT_UNKNOWN


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️⃣ 用正则表达式过滤(高级)

#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);

三、不推荐但常见:shell 过滤

如果你是命令行而不是编程:

ls | grep '\.txt$'

或

find . -maxdepth 1 -name '*.txt'

四、总结

方式 适用
字符串判断 文件名规则
d_type 快速类型判断
stat 精确类型
regex 复杂规则

如果你说的是 某个具体语言(Python / C++ / shell) 或 某种过滤需求(后缀 / 隐藏文件 / 权限),告诉我,我可以直接给你代码。

0 踩