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

一、概述

在实际的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,请扫描以下二维码:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-16 03:24:13

Linux下两种删除过期文件的方法详述的相关文章

Linux 下Shell脚本删除过期文件

在写这个shell之前先说一下,stat命令的使用方法 一.关于时间戳 每一个文件都有3中时间(称为时间戳timestamps),对这3种时间,很多时候容易混淆不清,因此 这里要说明下:   Access time(atime):是指取用文件的时间,所谓取用,常见的操作有:使用编辑器查看文件内容,使用cat命令显示文件内容,使用cp命令把该文件(即来源文件)复制成其他文件,或者在这个文件上运用grep sed more less tail head 等命令,凡是读取而不修改文件的操作,均衡改变文

Linux中有两种不同的文件链接类别。 符号链接(又称软链接) 硬链接

Linux中有两种不同的文件链接类别.符号链接(又称软链接)硬链接1.软链接文件的大小与源文件不同,软链接文件存储的是 软链接到源文件指向关系,所以很好理解他们的大小不同,可以理解为指针. 2.硬链接文件的索引节点编号,大小,最后修改时间完全相同,可以理解为 cp -p 了源文件,拷贝了一份源文件,且保留的源文件的属性 硬链接创建一个单独的文件,引用该硬链接文件的效果跟引用源文件一样:1.创建硬链接的方式方法一:cp -l 源文件 硬链接文件方法二:使用ln(取link之意),ln源文件 硬链接

linux下rm -r误删NTFS文件恢复方法

linux下rm -r误删NTFS文件恢复方法(nfs-3g) 一时疏忽,手一抖,把整个挂载的F盘删了一半!顿时傻眼!! 被删的F盘是Windows下NTFS分区,在Ubuntu12.04中挂载了F盘,使用rm命令时粗心大意,误删了一半的数据. 血的教训告诉我们,使用rm -r命令一定要带上-i,否则让你后悔莫及! 还好在Linux下有一种方法可以恢复被删除的NTFS分区文件. 本文地址:http://www.cnblogs.com/yhLinux/p/4106099.html 在文件被误删后,

两种 js下载文件的方法(转)

function DownURL(strRemoteURL, strLocalURL){ try{ var xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP"); xmlHTTP.open("Get", strRemoteURL, false); xmlHTTP.send(); var adodbStream = new ActiveXObject("ADODB.Stream"); adodbStrea

Linux下清空或删除大文件内容的5种方法

在Linux终端下处理文件时,有时候我们想要直接清空文件的内容时但又不用使用任何Linux命令行编辑器,去打开这些文件.那如何才能达到这个目的呢? 1.通过重定向到NULL来清空文件内容 清空或者让一个文件成为空白的最简单方式,是像下面那样,通过 shell 重定向 null 到该文件: 先看文件 access.log 的大小: 开始执行如下命令清空文件: 文件大小变为了0 2.通过 true 命令重定向来清空文件 下面将使用 : 符号,他是 shell 的一个内置命令,等同于 true 命令,

[ 总结 ] Linux下两种常用的双网卡绑定

1. mode=0 (round-robin) 链路聚合:将两个或者更多数据信道结合成一个单一的信道,该信道以一个更高带宽的逻辑链路出现,链路聚合一般用来连接一个或多个带宽需求量大的设备,链路聚合是指将多个物理端口绑定在一起,成为一个逻辑端口, 以实现出.入流量的各成员端口中的负荷分担,当一个成员端口故障时,就停止发送报文,并根据负荷分担策略在剩下的链路中重新计算报文发送,端口恢复后重新计算报文发送的端口.链路聚合在增加带宽.实现链路传输弹性和冗余方面是很重要的技术. 逻辑链路的带宽增加了大约(

linux下几种高速清空文件内容的方法

[[email protected] ~] : > filename [[email protected] ~] > filename [[email protected] ~] echo "" > filename [[email protected] ~] echo > filename [[email protected] ~] cat /dev/null > filename [[email protected] ~] sed -i '1,$d'

linux下几种快速清空文件内容的方法

[[email protected] ~] : > filename [[email protected] ~] > filename [[email protected] ~] echo "" > filename [[email protected] ~] echo > filename [[email protected] ~] cat /dev/null > filename [[email protected] ~] sed -i '1,$d'

ios 下两种生成唯一字符串的方法

CFUUIDRef uuidRef =CFUUIDCreate(NULL); CFStringRef uuidStringRef =CFUUIDCreateString(NULL, uuidRef); CFRelease(uuidRef); NSString *uniqueId = (__bridgeNSString *)uuidStringRef;