在 CentOS(Linux) 下,readdir 本身不会过滤目录项,它只是把目录里的所有内容(包括 . 和 ..、隐藏文件等)原样返回。
过滤需要在调用 readdir 后自己处理,或者在 shell / 应用层做。
下面分几种常见情况说明。
一、C 语言 readdir() 过滤(最常见)
1️⃣ 基本示例(过滤 . 和 ..)
#include
#include
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 过滤 . 和 ..
if (entry->d_name[0] == '.')
continue;
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
✅ 效果:不显示隐藏文件和 . / ..
2️⃣ 只显示普通文件(排除目录)
#include
if (entry->d_type == DT_REG) {
printf("file: %s\n", entry->d_name);
}
常见 d_type:
DT_REG:普通文件DT_DIR:目录DT_LNK:符号链接
⚠️ 注意:d_type 在某些文件系统(如 NFS)上可能不可用,此时需要用 lstat()。
3️⃣ 按文件名过滤(如只显示 .log)
#include
if (strstr(entry->d_name, ".log") == NULL)
continue;
二、使用 scandir()(推荐,支持过滤函数)
scandir() 原生支持过滤,比 readdir 更方便。
#include
#include
int filter(const struct dirent *entry) {
return entry->d_name[0] != '.'; // 排除隐藏文件
}
int main() {
struct dirent **namelist;
int n = scandir(".", &namelist, filter, alphasort);
for (int i = 0; i < n; i++) {
printf("%s\n", namelist[i]->d_name);
free(namelist[i]);
}
free(namelist);
}
✅ 优点:
- 自动排序
- 自带过滤函数
- 代码更简洁
三、Shell 层过滤(非 C 程序)
1️⃣ ls 过滤
ls -p | grep -v /
# 只显示文件(排除目录)
ls .*
# 只看隐藏文件
2️⃣ find 过滤(推荐)
find . -maxdepth 1 -type f
find . -maxdepth 1 -name "*.log"
四、常见需求速查表
| 需求 | 方法 |
|---|---|
| 排除隐藏文件 | d_name[0] != '.' |
| 只要普通文件 | d_type == DT_REG |
| 只要目录 | d_type == DT_DIR |
| 后缀过滤 | strstr() / fnmatch() |
| 排序 | scandir() |
| Shell 使用 | find / ls |
五、推荐实践 ✅
- 系统编程:用
scandir()(更安全、方便) - 兼容旧系统:
readdir()+ 手动过滤 - 脚本/运维:直接用
find
如果你能说明 语言(C / C++ / Python / Shell) 或 具体过滤规则(如“排除目录 + 只看 .conf 文件”),我可以给你更精确的示例。
