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

简介: 一、概述 在实际的C软件开发项目中,不同的软件会在不同的目录中生成文件,由于磁盘的存储空间有限,开发人员不得不考虑对目录下的过期文件进行删除。

一、概述
在实际的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,请扫描以下二维码:
这里写图片描述

目录
相关文章
|
25天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
56 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
11天前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
85 14
|
10天前
|
存储 NoSQL Linux
linux积累-core文件是干啥的
核心文件是Linux系统在程序崩溃时生成的重要调试文件,通过分析核心文件,开发者可以找到程序崩溃的原因并进行调试和修复。本文详细介绍了核心文件的生成、配置、查看和分析方法
41 6
|
12天前
|
存储 NoSQL Linux
linux之core文件如何查看和调试
通过设置和生成 core 文件,可以在程序崩溃时获取详细的调试信息。结合 GDB 等调试工具,可以深入分析 core 文件,找到程序崩溃的具体原因,并进行相应的修复。掌握这些调试技巧,对于提高程序的稳定性和可靠性具有重要意义。
59 6
|
2月前
|
Linux 开发工具 Perl
在Linux中,有一个文件,如何删除包含“www“字样的字符?
在Linux中,如果你想删除一个文件中包含特定字样(如“www”)的所有字符或行,你可以使用多种文本处理工具来实现。以下是一些常见的方法:
45 5
|
2月前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
57 6
|
2月前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
143 6
|
Linux
linux系统进程删除命令
linux学习记录
276 0
|
存储 Linux 数据安全/隐私保护
8.13 Linux删除系统用户(userdel命令)
userdel 命令功能很简单,就是删除用户的相关数据。此命令只有 root 用户才能使用。
179 0
8.13 Linux删除系统用户(userdel命令)
|
Linux
3.11 Linux删除空目录(rmdir命令)
和 mkdir 命令(创建空目录)恰好相反,rmdir(remove empty directories 的缩写)命令用于删除空目录,此命令的基本格式为:
312 0
3.11 Linux删除空目录(rmdir命令)