温馨提示×

Debian readdir默认排序规则

小樊
41
2026-06-30 21:29:30
栏目: 智能运维

在 Debian(以及大多数 Linux 发行版)中,readdir() 本身没有固定的排序规则,其返回的目录项顺序由底层文件系统决定

核心要点

1. readdir() 的行为

  • readdir()(及 readdir_r()按文件系统存储顺序返回目录项
  • 不保证任何特定顺序(不是字母序,也不是时间序)
  • 不同文件系统表现不同:
    • ext4:通常接近某种内部数据结构顺序,不能依赖
    • XFS / Btrfs / tmpfs:同样无序
  • 同一文件系统、同一目录,多次调用顺序通常稳定,但不保证

2. 与 ls 的区别

很多人误以为 readdir() 是排序的,是因为:

ls

默认会 按字母序排序。 但 ls 实际做了:

readdir() → 获取所有文件名 → 排序 → 输出

3. 如果你需要排序

必须自己在用户态排序

常见做法(C 语言):

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

int cmp(const void *a, const void *b) {
    return strcmp(*(const char **)a, *(const char **)b);
}

void readdir_sorted(const char *path) {
    DIR *dir = opendir(path);
    struct dirent *ent;
    const char **names = NULL;
    size_t count = 0;

    while ((ent = readdir(dir))) {
        names = realloc(names, (count + 1) * sizeof(char *));
        names[count++] = strdup(ent->d_name);
    }

    qsort(names, count, sizeof(char *), cmp);

    for (size_t i = 0; i < count; i++) {
        printf("%s\n", names[i]);
        free((void *)names[i]);
    }

    free(names);
    closedir(dir);
}

4. 总结一句话

Debian / Linux 中 readdir() 默认没有排序规则,顺序由文件系统决定。

如果需要按名称排序,必须自行排序,不能依赖 readdir() 的返回顺序。

如果你关心的是 POSIX 规范特定文件系统(如 ext4)行为,或 Python / shell / Go / Rust 的表现,我可以继续深入。

0