温馨提示×

centos readdir怎么过滤

小樊
38
2026-08-30 10:13:05
栏目: 智能运维

CentOS(Linux) 下,readdir 通常指 C 语言调用 readdir() 读取目录内容
“过滤”一般有两种理解,我都给你说明一下,并附常用示例。


一、只用 readdir() 进行过滤(C 语言)

readdir() 本身 不能过滤,只能在循环里判断。

示例:过滤掉 ...

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

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

    if (!dir) return 1;

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

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

    closedir(dir);
    return 0;
}

按文件类型过滤(只显示普通文件)

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

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

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

    closedir(dir);
    return 0;
}

⚠️ d_type 在某些文件系统(如 NFS)上可能不可用,稳妥做法是用 lstat()


二、结合 lstat() 精确过滤(推荐)

#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>

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

    while ((entry = readdir(dir)) != NULL) {
        lstat(entry->d_name, &st);

        if (S_ISREG(st.st_mode)) {
            printf("FILE: %s\n", entry->d_name);
        } else if (S_ISDIR(st.st_mode)) {
            printf("DIR : %s\n", entry->d_name);
        }
    }

    closedir(dir);
    return 0;
}

三、常见过滤需求示例

1️⃣ 过滤文件后缀(如 .log

#include <string.h>

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

2️⃣ 过滤隐藏文件

if (entry->d_name[0] == '.')
    continue;

3️⃣ 过滤目录,只列出文件

if (entry->d_type == DT_DIR)
    continue;

四、如果你指的是“命令行 readdir”

Linux 没有 readdir 命令,你可能想用的是:

ls
find

等价过滤示例

# 只看普通文件
find . -maxdepth 1 -type f

# 排除隐藏文件
ls -A

# 只看 .conf 文件
ls *.conf

五、总结

场景 做法
C 语言读目录 opendir + readdir
过滤内容 while 中判断
精确类型 lstat + S_IS*
命令行 ls / find

如果你能提供:

  • 语言(C / C++ / Shell)
  • 过滤条件(后缀 / 文件类型 / 隐藏文件)

我可以直接给你一份 可编译的完整代码

0