温馨提示×

centos readdir怎么排序

小樊
42
2026-09-21 10:13:46
栏目: 智能运维

在 CentOS(其实就是 Linux 下 C/C++ 编程)里,readdir() 本身不会排序,它返回的顺序是文件系统/目录项存储顺序(通常是无序的,跟 ls 看到的顺序不一样)。

如果你想“排序”,常见做法有三种:


一、用 readdir 读取后自己在程序里排序(最常用)

基本思路

  1. opendir + readdir 读取所有目录项
  2. 存到数组 / vector
  3. strcmp / std::sort 排序
  4. 再处理

C 示例(按名称排序)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.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[1024];
    int n = 0;

    while ((entry = readdir(dir))) {
        names[n++] = strdup(entry->d_name);
    }
    closedir(dir);

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

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

二、用 C++(更简单)

#include <dirent.h>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

int main() {
    DIR *dir = opendir(".");
    struct dirent *entry;
    std::vector<std::string> files;

    while ((entry = readdir(dir))) {
        files.push_back(entry->d_name);
    }
    closedir(dir);

    std::sort(files.begin(), files.end());

    for (auto &f : files)
        std::cout << f << std::endl;
}

三、直接调用系统命令(不推荐在程序里)

如果你只是脚本或临时用:

ls -1 | sort

ls -1 /path | sort

补充:常见排序需求

1️⃣ 按文件名(字典序)

  • strcmp
  • std::sort

2️⃣ 按修改时间排序

需要 stat() 拿到 st_mtime 再排序

3️⃣ 按大小排序

stat()st_size

4️⃣ 忽略 ...

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

总结一句话

readdir 不排序,必须你自己排序

如果你告诉我:

  • C 还是 C++
  • 名字 / 时间 / 大小
  • 是否要 递归子目录

我可以直接给你完整可用代码。

0