linux下找到指定目录下最新日期log文件

以下是一个完整的C函数,用于在指定目录下自动查找最近更新的日志文件(根据文件名中的时间戳选择最新的文件):

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <regex.h>

// 检查文件名是否符合日志格式: YYYY-MM-DD_HH-MM-SS.log
int is_valid_log_filename(const char *filename) {
    regex_t regex;
    int ret;
    
    // 编译正则表达式
    char *pattern = "^[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}\\.log$";
    if (regcomp(&regex, pattern, REG_EXTENDED) != 0) {
        return 0; // 正则编译失败
    }
    
    // 执行匹配
    ret = regexec(&regex, filename, 0, NULL, 0);
    regfree(&regex);
    
    return (ret == 0) ? 1 : 0;
}

// 查找最新日志文件
char *find_latest_log(const char *log_dir) {
    DIR *dir;
    struct dirent *entry;
    char *latest_file = NULL;
    
    // 打开日志目录
    if ((dir = opendir(log_dir)) == NULL) {
        perror("无法打开日志目录");
        return NULL;
    }
    
    // 遍历目录中的文件
    while ((entry = readdir(dir)) != NULL) {
        // 跳过.和..目录
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue;
        }
        
        // 检查文件名格式
        if (is_valid_log_filename(entry->d_name)) {
            // 如果是第一个有效文件或比当前最新文件更新
            if (latest_file == NULL || strcmp(entry->d_name, latest_file) > 0) {
                // 释放之前的内存(如果有)
                if (latest_file != NULL) {
                    free(latest_file);
                }
                
                // 分配内存并复制新文件名
                latest_file = strdup(entry->d_name);
                if (latest_file == NULL) {
                    perror("内存分配失败");
                    closedir(dir);
                    return NULL;
                }
            }
        }
    }
    
    closedir(dir);
    
    // 如果找到最新文件,构建完整路径
    if (latest_file != NULL) {
        // 计算完整路径长度
        size_t path_len = strlen(log_dir) + strlen(latest_file) + 2; // +2 用于'/'和空字符
        char *full_path = malloc(path_len);
        if (full_path == NULL) {
            perror("内存分配失败");
            free(latest_file);
            return NULL;
        }
        
        // 构建完整路径
        snprintf(full_path, path_len, "%s/%s", log_dir, latest_file);
        free(latest_file);
        return full_path;
    }
    
    return NULL; // 未找到符合条件的日志文件
}

// 使用示例:
int main() {
    const char *log_dir = "/appdata/log";
    char *latest_log = find_latest_log(log_dir);
    
    if (latest_log != NULL) {
        printf("最新的日志文件是: %s\n", latest_log);
        free(latest_log);
    } else {
        printf("未找到符合条件的日志文件\n");
    }
    
    return 0;
}

函数说明:

  1. is_valid_log_filename 函数

    • 使用正则表达式验证文件名是否符合 YYYY-MM-DD_HH-MM-SS.log 格式

    • 确保只处理符合命名规范的日志文件

  2. find_latest_log 函数

    • 输入:日志目录路径 (如 "/appdata/log")

    • 输出:最新日志文件的完整路径(动态分配的内存,需调用者释放)

    • 处理流程

      1. 打开指定目录

      2. 遍历所有文件,跳过 "." 和 ".."

      3. 验证文件名格式是否符合日志文件规范

      4. 通过字符串比较找到时间戳最新的文件(文件名越大表示时间越新)

      5. 构建完整路径并返回

  3. 内存管理

    • 使用 strdupmalloc 动态分配内存

    • 调用者负责使用 free() 释放返回的字符串

  4. 错误处理

    • 检查目录打开是否成功

    • 处理内存分配失败的情况

    • 未找到文件时返回 NULL

编译说明:

  1. 需要链接正则表达式库:

    bash

    复制

    下载

    复制代码
    gcc -o log_finder log_finder.c -lregex
  2. 运行示例:

    bash

    复制

    下载

    复制代码
    ./log_finder

注意事项:

  1. 文件名格式必须严格遵循 YYYY-MM-DD_HH-MM-SS.log 格式

  2. 函数仅基于文件名判断,不检查文件修改时间

  3. 返回的路径字符串需要调用者释放内存

  4. 如果目录中有大量文件,建议添加最大文件数量限制

  5. 对于嵌入式系统等资源受限环境,可简化正则表达式检查

此实现能正确处理您提供的示例文件列表,并返回最新文件(如 "2025-08-15_11-07-58.log")。

相关推荐
2601_961875248 分钟前
法考资料2026|全套|资料已整理
数据结构·算法·链表·贪心算法·eclipse·线性回归·动态规划
无限码力13 分钟前
美团研发岗 4月18号笔试真题 - 坐标
算法·美团笔试真题·美团笔试题·美团研发岗笔试题·美团研发岗4月18号真题
hj28625123 分钟前
Linux 网络服务综合笔记(概念 + 命令 + 实操案例)2
linux·运维·网络
what_201824 分钟前
Linux 磁盘 (查看、划分、inode)
linux·运维·服务器
27399202943 分钟前
GDB调试(Linux)
linux
有点。1 小时前
C++倍增法(练习题)
c++·算法
凡人叶枫1 小时前
Effective C++ 条款23:宁以 non-member、non-friend 替换 member 函数
linux·开发语言·c++·嵌入式开发
不会C语言的男孩1 小时前
Linux 系统编程 · 第 4 章:文件属性与元数据
linux·c语言·开发语言
小生不才yz1 小时前
Shell脚本精读 · S02-03 | 词拆分、通配符与未加引号的变量
linux
2601_961845422 小时前
法考真题及答案解析|历年真题|资料已整理
linux·windows·ubuntu·macos·centos·gnu