linux

Linux copendir如何筛选特定文件

小樊
44
2025-12-09 05:31:59
栏目: 智能运维

在 Linux 中,copendir 函数用于打开一个目录流,以便读取目录中的文件和子目录。要筛选特定文件,可以使用 readdir 函数遍历目录流,并使用 fnmatch 函数或正则表达式来匹配特定文件名模式。

以下是一个使用 copendirreaddir 函数筛选特定文件的示例:

#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 结尾的文件。

0
看了该问题的人还看了