温馨提示×

linux readdir怎样排序文件

小樊
41
2026-10-17 07:34:49
栏目: 智能运维

在 Linux 下使用 readdir() 读取目录时,默认顺序是不确定的(通常是文件系统返回的顺序,不一定是字母序)。如果你想要“排序文件”,常见的做法有下面几种。


一、readdir 本身不排序(重要)

readdir() 只负责逐个读取目录项:

struct dirent *entry;
DIR *dir = opendir(".");
while ((entry = readdir(dir)) != NULL) {
    printf("%s\n", entry->d_name);
}
closedir(dir);

⚠️ 这个输出不是排序的。


二、推荐做法:先读出来,再排序(最常用)

1️⃣ 用 scandir()(最简单)

scandir() 是 专门为排序设计的。

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

int main() {
    struct dirent **namelist;
    int n = scandir(".", &namelist, NULL, alphasort);
    if (n < 0) return 1;

    for (int i = 0; i < n; i++) {
        printf("%s\n", namelist[i]->d_name);
        free(namelist[i]);
    }
    free(namelist);
    return 0;
}

✅ alphasort:按字母排序
✅ versionsort:按版本号排序(如 file1, file2, file10)


2️⃣ 用 readdir + qsort(手动排序)

如果你必须用 readdir:

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

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

int main() {
    DIR *dir = opendir(".");
    struct dirent *entry;
    char **names = NULL;
    int count = 0;

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

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

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

三、按不同规则排序

排序方式 方法
字母序 alphasort / strcmp
版本序 versionsort
修改时间 读 stat(),按 st_mtime
文件大小 stat() + st_size
反向排序 排序后反转

四、Shell 中(非 C)

ls -1 | sort
ls -lt        # 按时间
ls -lS        # 按大小

✅ 总结建议

  • 不想排序逻辑复杂 → 用 scandir() ✅
  • 必须用 readdir → 读完后 qsort
  • readdir 本身 不会排序

如果你愿意,我可以按你的具体需求(比如按时间 / 只列文件 / 忽略 . 和 ..)写完整示例。

0 踩