温馨提示×

CentOS readdir如何过滤

小樊
38
2026-07-09 01:48:33
栏目: 智能运维

CentOS(Linux) 下,readdir 本身不会过滤目录项,它只是把目录里的所有内容(包括 ...、隐藏文件等)原样返回。
过滤需要在调用 readdir 后自己处理,或者在 shell / 应用层做。

下面分几种常见情况说明。


一、C 语言 readdir() 过滤(最常见)

1️⃣ 基本示例(过滤 ...

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

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

    while ((entry = readdir(dir)) != NULL) {
        // 过滤 . 和 ..
        if (entry->d_name[0] == '.')
            continue;

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

    closedir(dir);
    return 0;
}

✅ 效果:不显示隐藏文件和 . / ..


2️⃣ 只显示普通文件(排除目录)

#include <sys/stat.h>

if (entry->d_type == DT_REG) {
    printf("file: %s\n", entry->d_name);
}

常见 d_type

  • DT_REG:普通文件
  • DT_DIR:目录
  • DT_LNK:符号链接

⚠️ 注意:d_type 在某些文件系统(如 NFS)上可能不可用,此时需要用 lstat()


3️⃣ 按文件名过滤(如只显示 .log

#include <string.h>

if (strstr(entry->d_name, ".log") == NULL)
    continue;

二、使用 scandir()(推荐,支持过滤函数)

scandir() 原生支持过滤,比 readdir 更方便。

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

int filter(const struct dirent *entry) {
    return entry->d_name[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);
}

✅ 优点:

  • 自动排序
  • 自带过滤函数
  • 代码更简洁

三、Shell 层过滤(非 C 程序)

1️⃣ ls 过滤

ls -p | grep -v /
# 只显示文件(排除目录)
ls .*
# 只看隐藏文件

2️⃣ find 过滤(推荐)

find . -maxdepth 1 -type f
find . -maxdepth 1 -name "*.log"

四、常见需求速查表

需求 方法
排除隐藏文件 d_name[0] != '.'
只要普通文件 d_type == DT_REG
只要目录 d_type == DT_DIR
后缀过滤 strstr() / fnmatch()
排序 scandir()
Shell 使用 find / ls

五、推荐实践 ✅

  • 系统编程:用 scandir()(更安全、方便)
  • 兼容旧系统readdir() + 手动过滤
  • 脚本/运维:直接用 find

如果你能说明 语言(C / C++ / Python / Shell)具体过滤规则(如“排除目录 + 只看 .conf 文件”),我可以给你更精确的示例。

0