IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Linux下两种删除过期文件的方法详述

    zhouzxi发表于 2015-07-29 11:25:17
    love 0

    一、概述
    在实际的C软件开发项目中,不同的软件会在不同的目录中生成文件,由于磁盘的存储空间有限,开发人员不得不考虑对目录下的过期文件进行删除。一般说来,有两种删除过期文件的方法,一种是在C程序中实现,一种是利用crontab实现。本文对这两种方法的具体实现进行详细的介绍。
    为了便于说明,本文中的过期文件的后缀为.c,存放在/home/zhou/zhouzx/Test目录下,过期时间为1天。

    二、在C程序中实现过期文件删除
    在该方法中,我们要考虑的主要问题为:
    (1)要删除过期多久的文件?文件存放在哪里?文件存放路径可以查看文件生成模块的配置,看它们将文件生成在哪个目录中;而删除过期多久的文件一般都是由需求决定的。
    (2)文件不会同时超期,而是在不同的时间段里超期,对此,程序该如何处理?我们的想法是删除在当前时间段内超期的文件之后,程序休眠一段时间之后接着再去执行删除任务,相当于是周期性地执行删除任务。

    完整的C程序代码如下:

    /**********************************************************************
    * 版权所有 (C)2015, Zhou Zhaoxiong。
    *
    * 文件名称:DelExpiredFiles.c
    * 文件标识:无
    * 内容摘要:创建现场删除过期文件
    * 其它说明:无
    * 当前版本:V1.0
    * 作    者:Zhou Zhaoxiong
    * 完成日期:20150729
    *
    **********************************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <sys/time.h>
    
    // 重定义数据类型
    typedef signed   int    INT32;
    typedef unsigned int    UINT32;
    typedef unsigned char   UINT8;
    
    // 函数声明
    void Sleep(UINT32 iCountMs);
    void DelExpiredFiles(UINT8 *pszFileSaveDir, UINT32 iFileSaveDays);
    INT32 main();
    
    
    /**********************************************************************
    * 功能描述:主函数
    * 输入参数:无
    * 输出参数:无
    * 返 回 值:无
    * 其它说明:无
    * 修改日期        版本号     修改人            修改内容
    * -------------------------------------------------------------------
    * 20150729        V1.0     Zhou Zhaoxiong        创建
    ***********************************************************************/
    INT32 main()
    {   
        UINT8  szFileSaveDir[1024] = {0};
        UINT32 iFileSaveDays       = 0;
    
        // 获取过期文件目录
        snprintf(szFileSaveDir, sizeof(szFileSaveDir) - 1, "%s/zhouzx/Test/", getenv("HOME"));
    
        // 获取过期文件保留天数
        iFileSaveDays = 1;
    
        while (1)
        {
            printf("Now, begin to delete expired files.\n"); 
            // 调用函数删除满足条件的过期文件
            DelExpiredFiles(szFileSaveDir, iFileSaveDays);
    
            Sleep(5 * 60 * 1000);    // 休息5分钟之后继续
    
            printf("Sleep 5 minutes, then go ahead.\n"); 
        }
    
        return 0;
    }
    
    
    /**********************************************************************
    * 功能描述: 程序休眠
    * 输入参数: iCountMs-休眠时间(单位:ms)
    * 输出参数: 无
    * 返 回 值: 无
    * 其它说明: 无
    * 修改日期       版本号       修改人        修改内容
    * ------------------------------------------------------------------
    * 20150729       V1.0     Zhou Zhaoxiong     创建
    ********************************************************************/ 
    void Sleep(UINT32 iCountMs)
    {
        struct timeval t_timeout = {0};
    
        if (iCountMs < 1000)
        {
            t_timeout.tv_sec  = 0;
            t_timeout.tv_usec = iCountMs * 1000;
        }
        else
        {
            t_timeout.tv_sec  = iCountMs / 1000;
            t_timeout.tv_usec = (iCountMs % 1000) * 1000;
        }
        select(0, NULL, NULL, NULL, &t_timeout);    // 调用select函数阻塞程序
    }
    
    
    /*----------------------------------------------------
    * 功能描述: 删除超期的过期文件
    * 输入参数: pszFileSaveDir-过期文件保存目录
                iFileSaveDays-过期文件保存天数
    * 输出参数: 无
    * 返 回 值: 无
    * 其他说明: 无
    * 修改日期       版本号      修改人        修改内容
    * ----------------------------------------------------
    * 20150729       V1.0     Zhou Zhaoxiong     创建
    ----------------------------------------------------*/
    void DelExpiredFiles(UINT8 *pszFileSaveDir, UINT32 iFileSaveDays)
    {
        UINT8 szCmdBuf[1024] = {0};
    
        if (pszFileSaveDir == NULL)
        {
            printf("DelExpiredFiles: input parameter is NULL!\n");
            return;
        }
    
        // 执行shell命令删除过期文件(过期文件的后缀为.c)
        snprintf(szCmdBuf, sizeof(szCmdBuf) - 1, "find %s -name \"*.c\" -ctime +%d -exec rm -f {} \\;", pszFileSaveDir, iFileSaveDays);
    
        system(szCmdBuf);
    
        printf("DelExpiredFiles: exec command [%s] to delete expired files successfully!\n", szCmdBuf);
    }
    

    三、利用crontab实现过期文件删除
    通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell脚本。利用这个特性,我们可以将删除过期文件的指令存放在shell脚本中,然后用crontab 命令来周期性地调用这个脚本执行删除操作。
    在crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,每个字段之间用空格分割,没用的段用*代替,格式如下:

    minute   hour   day   month   week   command

    其中:
    minute: 表示分钟,可以是从0到59之间的任何整数。
    hour:表示小时,可以是从0到23之间的任何整数。
    day:表示日期,可以是从1到31之间的任何整数。
    month:表示月份,可以是从1到12之间的任何整数。
    week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
    command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件(如shell文件)。

    具体操作步骤如下:
    1.编写删除过期文件的shell脚本,取名del_expiredfiles.sh,存放在/home/zhou/zhouzx/Test目录下。文件内容为:

    #!/bin/ksh
    
    FILEPATH="/home/zhou/zhouzx/Test"
    DAYS=1
    
    ################################################################################
    ################################################################################
    main()
    {
        find $FILEPATH -name "*.c" -ctime +$DAYS -type f -exec rm -rf {} \;
    }
    
    ## Execute main function
    main $*
    

    2.登录到root用户下,执行crontab –e命令进入crontab文件中,在该文件中添加如下内容:

    0 1 * * * /home/zhou/zhouzx/Test/del_expiredfiles.sh -D 1

    对照crontab文件中任务的格式,我们可以看出所添加内容的具体含义是:每天的1点钟执行/home/zhou/zhouzx/Test/目录下的del_expiredfiles.sh文件。

    3.保存对crontab文件的修改,观察命令执行结果。

    四、总结
    以上两种删除过期文件的方法在实际的软件开发项目中均有应用,大家要根据项目组的实际情况来选择合适的方法。


    本人微信公众号:zhouzxi,请扫描以下二维码:
    这里写图片描述



沪ICP备19023445号-2号
友情链接