在 Linux 中,copendir 函数用于打开一个目录流,以便读取目录中的文件和子目录。要筛选特定文件,可以使用 readdir 函数遍历目录流,并使用 fnmatch 函数或正则表达式来匹配特定文件名模式。
以下是一个使用 copendir 和 readdir 函数筛选特定文件的示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <fnmatch.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage: %s <directory> <pattern>\n", argv[0]);
return 1;
}
const char *dir = argv[1];
const char *pattern = argv[2];
DIR *dp = opendir(dir);
if (dp == NULL) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dp)) != NULL) {
if (fnmatch(pattern, entry->d_name, 0) == 0) {
printf("Matched: %s\n", entry->d_name);
}
}
closedir(dp);
return 0;
}
编译并运行此程序,传入要搜索的目录和文件名模式。例如:
gcc filter_files.c -o filter_files
./filter_files /path/to/directory "*.txt"
这将输出 /path/to/directory 目录中所有以 .txt 结尾的文件。
如果你想使用正则表达式进行筛选,可以使用 pcre 库。以下是一个使用 pcre 库筛选特定文件的示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <pcre.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage: %s <directory> <pattern>\n", argv[0]);
return 1;
}
const char *dir = argv[1];
const char *pattern = argv[2];
DIR *dp = opendir(dir);
if (dp == NULL) {
perror("opendir");
return 1;
}
struct dirent *entry;
const char *error;
int erroffset;
pcre *re;
int ovector[30];
int rc;
re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
if (re == NULL) {
fprintf(stderr, "PCRE compilation failed at offset %d: %s\n", erroffset, error);
return 1;
}
while ((entry = readdir(dp)) != NULL) {
rc = pcre_exec(re, NULL, entry->d_name, strlen(entry->d_name), 0, 0, ovector, 30);
if (rc >= 0) {
printf("Matched: %s\n", entry->d_name);
}
}
pcre_free(re);
closedir(dp);
return 0;
}
编译并运行此程序,传入要搜索的目录和正则表达式模式。例如:
gcc filter_files.c -o filter_files -lpcre
./filter_files /path/to/directory ".*\.txt"
这将输出 /path/to/directory 目录中所有以 .txt 结尾的文件。