温馨提示×

debian readdir怎样遍历目录

小樊
45
2026-09-28 12:35:59
栏目: 智能运维

在 Debian(以及所有 Linux 系统)中,遍历目录通常是通过 readdir 系列函数(C 语言)或 shell 命令来完成的。下面分几种常见方式说明。


一、C 语言中使用 readdir 遍历目录

1. 基本流程

  1. opendir() 打开目录
  2. readdir() 逐个读取目录项
  3. closedir() 关闭目录

2. 示例代码

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

int main(int argc, char *argv[]) {
    DIR *dir;
    struct dirent *entry;

    if (argc < 2) {
        fprintf(stderr, "Usage: %s <directory>\n", argv[0]);
        return 1;
    }

    dir = opendir(argv[1]);
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }

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

    closedir(dir);
    return 0;
}

3. 编译运行

gcc readdir_example.c -o readdir_example
./readdir_example /path/to/dir

二、递归遍历目录(常见需求)

readdir 本身不会递归,需要自己判断:

  • DT_DIR:目录
  • 跳过 . 和 ..

示例(简化):

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

void list_dir(const char *path) {
    DIR *dir = opendir(path);
    struct dirent *entry;

    if (!dir) return;

    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 newpath[1024];
            snprintf(newpath, sizeof(newpath), "%s/%s", path, entry->d_name);
            list_dir(newpath);
        }
    }
    closedir(dir);
}

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

三、Shell 中“等价”于 readdir 的方式

如果你不是写 C 程序,而是想在 Debian 上遍历目录:

1. 使用 ls

ls /path/to/dir

2. 使用 find(递归)

find /path/to/dir

3. 使用 for 循环

for f in /path/to/dir/*; do
    echo "$f"
done

四、常见问题

1. readdir 返回的顺序

  • 不保证排序
  • 如需排序,可用 scandir()

2. d_type 不一定可靠

某些文件系统(如某些网络文件系统)可能返回 DT_UNKNOWN,需要用 stat() 判断。


如果你是想:

  • ✅ 写 C 程序
  • ✅ 写 Python / Shell
  • ✅ 做递归遍历
  • ✅ 过滤特定文件

可以告诉我你的具体使用场景,我可以给你更精确的示例。

0 踩