在 Debian(实际上是 Linux 下 C/C++ 编程)里,readdir 本身不会帮你过滤,它只是把目录里的每一个条目读出来。
过滤要在你自己的代码里做。下面按常见场景说明。
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
while ((entry = readdir(dir)) != NULL) {
if (strncmp(entry->d_name, ".", 1) == 0)
continue; // 跳过隐藏文件
if (strstr(entry->d_name, ".txt"))
printf("%s\n", entry->d_name);
}
用 entry->d_type
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_REG) // 普通文件
printf("文件: %s\n", entry->d_name);
else if (entry->d_type == DT_DIR) // 目录
printf("目录: %s\n", entry->d_name);
}
常见类型:
DT_REG 普通文件DT_DIR 目录DT_LNK 符号链接DT_UNKNOWN 未知(需 stat)⚠️ 某些文件系统
d_type可能是DT_UNKNOWN
最可靠:
#include <sys/stat.h>
struct stat st;
char path[256];
while ((entry = readdir(dir)) != NULL) {
snprintf(path, sizeof(path), "./%s", entry->d_name);
stat(path, &st);
if (S_ISREG(st.st_mode))
printf("普通文件: %s\n", entry->d_name);
}
#include <regex.h>
regex_t reg;
regcomp(®, ".*\\.log$", REG_EXTENDED);
while ((entry = readdir(dir)) != NULL) {
if (!regexec(®, entry->d_name, 0, NULL, 0))
printf("%s\n", entry->d_name);
}
regfree(®);
如果你是命令行而不是编程:
ls | grep '\.txt$'
或
find . -maxdepth 1 -name '*.txt'
| 方式 | 适用 |
|---|---|
| 字符串判断 | 文件名规则 |
| d_type | 快速类型判断 |
| stat | 精确类型 |
| regex | 复杂规则 |
如果你说的是 某个具体语言(Python / C++ / shell) 或 某种过滤需求(后缀 / 隐藏文件 / 权限),告诉我,我可以直接给你代码。