温馨提示×

centos readdir能否递归子目录

小樊
36
2026-10-20 16:44:40
栏目: 智能运维

简短结论:readdir 本身不能递归子目录,它只能读取单个目录下的条目(文件和子目录名),是否递归需要你自己写代码实现。


1. readdir 是什么

在 CentOS / Linux 中,readdir 是 POSIX 标准 C 库函数:

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

作用:

  • 打开一个目录(opendir)
  • 每次调用 readdir 返回一个目录项
  • 只包含当前目录的内容,不会进入子目录

2. 为什么不能递归

readdir 返回的结构体中:

  • d_name:文件名
  • d_type:文件类型(普通文件 / 目录等)

它不会自动遍历子目录。

如果你要递归,需要:

  1. 用 readdir 读取当前目录
  2. 判断 d_type == DT_DIR
  3. 对子目录再次 opendir + readdir

3. 递归示例(C 语言)

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

void list_dir(const char *path) {
    DIR *dir = opendir(path);
    if (!dir) return;

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

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

        if (entry->d_type == DT_DIR) {
            char sub[1024];
            snprintf(sub, sizeof(sub), "%s/%s", path, entry->d_name);
            list_dir(sub);  // 递归
        }
    }
    closedir(dir);
}

int main() {
    list_dir(".");
    return 0;
}

4. 更简单的方式(不用自己写递归)

如果你只是使用命令,而不是写 C 程序:

find /path -type f

或

ls -R /path

5. 总结

方式 是否递归
readdir ❌ 不递归(需手动实现)
find ✅ 递归
ls -R ✅ 递归

如果你是 写程序 / shell / Python / 内核模块,可以告诉我具体场景,我可以给你更合适的方案。

0 踩