温馨提示×

linux readdir怎样排序

小樊
42
2026-09-11 14:10:56
栏目: 智能运维

在 Linux 下使用 readdir 读取目录时,readdir 本身并不保证任何顺序(通常是目录项在文件系统中的存储顺序)。如果你需要排序,一般做法是:

  1. 先用 readdir 把所有目录项读出来
  2. 放到数组 / 链表里
  3. 用排序函数排序(如 qsort 或 C++ 的 std::sort

下面给你几种常见排序方式。


一、按文件名排序(最常用)

示例(C 语言,按字典序)

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

struct Entry {
    char name[256];
};

int compare(const void *a, const void *b) {
    return strcmp(((struct Entry *)a)->name,
                  ((struct Entry *)b)->name);
}

int main() {
    DIR *dir = opendir(".");
    if (!dir) return 1;

    struct Entry entries[1024];
    int count = 0;

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        strcpy(entries[count].name, entry->dname);
        count++;
    }
    closedir(dir);

    qsort(entries, count, sizeof(struct Entry), compare);

    for (int i = 0; i < count; i++) {
        printf("%s\n", entries[i].name);
    }
    return 0;
}

二、按文件修改时间排序

需要配合 stat

#include <sys/stat.h>
#include <time.h>

struct Entry {
    char name[256];
    time_t mtime;
};

int compare_time(const void *a, const void *b) {
    return ((struct Entry *)a)->mtime -
           ((struct Entry *)b)->mtime;
}

读取时:

struct stat st;
stat(entry->d_name, &st);
entries[count].mtime = st.st_mtime;

三、忽略 ...

if (strcmp(entry->d_name, ".") == 0 ||
    strcmp(entry->d_name, "..") == 0)
    continue;

四、更简单的替代方案(推荐)

1️⃣ scandir(自动排序)

struct dirent **namelist;
int n = scandir(".", &namelist, NULL, alphasort);
for (int i = 0; i < n; i++) {
    printf("%s\n", namelist[i]->d_name);
    free(namelist[i]);
}
free(namelist);

✅ 自动按文件名排序
✅ 代码更简洁


2️⃣ Shell / 脚本场景

ls -1 | sort

总结

方式 是否排序 说明
readdir 需手动排序
scandir 推荐
readdir + qsort 灵活

如果你是 C / C++ / 嵌入式 / 特定文件系统(如 ext4、overlayfs),可以告诉我,我可以给更贴合的示例。

0