当前位置: 首页 > news >正文

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. 内存管理

    • 使用 strdup 和 malloc 动态分配内存

    • 调用者负责使用 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")。

http://www.dtcms.com/a/333469.html

相关文章:

  • liteflow
  • CSS从入门到精通完整指南
  • 【学习笔记】Java并发编程的艺术——第8章 Java中的并发工具类
  • Python工具箱系列(六十二)
  • 写作在学习中的重要性
  • 【完整源码+数据集+部署教程】脑部健康状态检测系统源码和数据集:改进yolo11-AIFI
  • 力扣top100(day04-05)--堆
  • **标题:发散创新之力,探索隐私计算的未来**隐私计算,作为当下数字化时代的热门话题,正受
  • MCP简单入门及简单操作案例(高德地图调用实现酒店查询天气查询等[Lima]示范)
  • 在执行部署脚本后,通过 ls -la 命令查看远程服务器文件时,显示的文件所有者是 games 而不是预期的 root 用户
  • 二、DOCKER常用命令
  • 最长递增子序列-dp问题+二分优化
  • Vue 侦听器(watch 与 watchEffect)全解析1
  • 【161页PPT】智慧方案企业数字化转型概述(课件)(附下载方式)
  • pcl法线估计的踩坑
  • 【GPT入门】第47课 大模型量化中 float32/float16/uint8/int4 的区别解析:从位数到应用场景
  • 《P1194 买礼物》
  • PyTorch的安装-CPU版本或者GPU安装有什么区别吗
  • 口播数字人免费API调用方案
  • Docker的相关知识探究详解
  • 【功能更新】“弹性互联网”正式上线Fusion WAN平台
  • Oracle按照特定列值排序和C#统计特定列值的所有行
  • 数据结构:N叉树 (N-ary Tree)
  • 【部署K8S集群】 1、安装前环境准备配置
  • Deepoc具身智能模型如何重塑康复辅助设备
  • Java中MybatisPlus使用多线程多数据源失效
  • 集成电路学习:什么是Image Segmentation图像分割
  • 功能组和功能组状态的概念关系和区别
  • java16学习笔记-Vector API
  • oracle数据库初始化