IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux指定目录下按文件创建时间清理旧文件的实现 -> 正文阅读

[系统运维]linux指定目录下按文件创建时间清理旧文件的实现

一. 问题描述
linux的一个目录下存放着日志文件,每个日志文件都是打包压缩好的。每次生成新的日志文件后,都要检查一下是否超过10个,如果超过10个则删掉最旧的日志文件。依此滚动循环。

二. 代码实现

  • 假设存放日志的目录是:/home/log,且该目录下只存放日志文件,无其他文件
  • 假设日志文件名格式为log_xxx_xxx.zip
  1. bash版
#获取日志文件数量
num=`ls /home/log -l |grep "^-"|wc -l`;
#需要保留的日志数量上限
retaincount = 10;
cd /home/log
#如果现有文件数量超过设定的上限,则按文件创建时间排序,旧文件在前;将超过上限个数的文件删除
if [ $num -gt $retaincount ];
then
    num=`expr $num - $retaincount`
    ls -tr *log_*|head -$num|xargs rm -rf {} 
fi
  1. C++版
    /**
     * @brief purgeOldFiles - 按创建时间和指定保留个数清理旧文件
     * @param dir_path 清理目录
     * @param retrieve_str 要检索的字符(检索出所有文件名中含有该字符的文件)
     * @param retain_count 要保留的文件个数上限
     * @return 0 = 成功,非0 = 失败; -1 = 路径不存在
     */
int purgeOldFiles(const string &dir_path, const string &retrieve_str, const uint retain_count)
{
    //定义结构体
    typedef struct{
        string filename;
        time_t filemtime;
    } File_STU;

    //用于排序,按创建时间小到大排序
    struct cmp{
        bool operator()(const File_STU &fileA, const File_STU &fileB){
            return fileA.filemtime < fileB.filemtime;
        }
    };

    DIR *dir = opendir(dir_path.c_str());
    if(NULL == dir)
    {
      printf("opendir error: %s \n", strerror(errno));
      return -1;
    }

    struct dirent *dirp = NULL;
    struct stat fileStat;
    vector<File_STU> fileVec;

    //根据指定的检索字符遍历找到所有符合条件的文件
    while((dirp = readdir(dir)) != NULL)
    {
        if(!string(dirp->d_name).compare(".") || !string(dirp->d_name).compare("..")){
            continue;
        }

        if(dirp->d_type == DT_REG  &&
                (string(dirp->d_name).find(retrieve_str) != string::npos)){

            //每找到一个文件,获取文件的创建时间,同时加入到容器中保存
            string fullpath = dir_path + dirp->d_name;

            if(0 != stat(fullpath.c_str(), &fileStat)){
                printf("read file stat error: %s \n", strerror(errno));
                continue;
            }

            File_STU tmpfile = {fullpath, fileStat.st_ctime};

            fileVec.emplace_back(tmpfile);
        }
    }

    closedir(dir);

    //如果文件个数小于要保留的个数,则不需要进行操作;否则,按文件创建时间排序,删除早期创建的文件
    if(fileVec.size() <= retain_count){
        return 0;
    }
    else{
        sort(fileVec.begin(), fileVec.end(), cmp{});

        for(uint i = 0; i < fileVec.size() - retain_count; ++i){
            std::remove(fileVec[i].filename.c_str());
        }
    }

    return 0;
}
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 19:10:50  更:2022-03-30 19:11:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:24:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码