在 Debian(以及一般的 Linux 文件系统) 中,readdir() 返回的目录项顺序不是由 C 标准或 POSIX 规定的固定顺序,而是取决于底层文件系统和内核实现。
下面分层次说明:
readdir() 本身不排序readdir()(以及 opendir/closedir)只是按内核/文件系统给出的顺序依次返回目录项:
示例(C):
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
输出顺序 ≠ ls 的默认排序。
| 文件系统 | readdir 顺序特点 |
|---|---|
| ext4 | 通常接近创建顺序 / 哈希顺序(不完全可预测) |
| xfs | 按目录结构内部顺序 |
| btrfs | 不保证顺序 |
| tmpfs | 不保证顺序 |
| overlayfs | 取决于底层叠加 |
内核从 inode / 目录项结构中读取,顺序由 FS 内部实现决定。
ls 为什么看起来是排序的?ls 默认会自己排序:
ls
等价于:
ls | sort
但:
ls -U
或
ls --sort=none
会直接按 readdir() 顺序输出。
在 Debian 上:
readdir() → getdents64() 系统调用struct linux_dirent64[]struct dirent顺序在 内核 VFS + 文件系统 层已经确定。
推荐方式:
#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);
}
ls | sort
import os
sorted(os.listdir('.'))
Debian 上
readdir()的返回顺序是“文件系统内部顺序”,不是字母序,也不是可依赖的稳定顺序;任何顺序要求都应在用户态显式排序。
如果你关心的是:
可以告诉我,我可以给更针对性的说明。