定时删除 30 天前的文件:cron 与 find

服务器上的日志文件如果一直不清理,迟早会把磁盘占满。最省心的办法是用 Linux 的 cron job 定期执行一条 find 命令,自动删掉 30 天前的旧文件。本文以每天清理 /logs 目录为例,记录完整的配置过程。

编写清理脚本

cron 系统专门提供了 /etc/cron.daily 目录,放在这个目录下的可执行脚本会被每天自动执行一次。我们在这里创建一个脚本:

cd /etc/cron.daily
vi logcron

输入如下内容:

#!/bin/sh
find /logs -type f -ctime +30 | xargs rm -rf

第二行就是核心:在 /logs 目录下查找 30 天之前的普通文件,然后交给 rm -rf 删除。

赋予可执行权限

保存文件后,执行如下命令给该文件加上可执行权限,否则 cron 不会运行它:

chmod +x /etc/cron.daily/logcron

到这里配置就完成了,之后系统每天都会自动清理一次超过 30 天的文件。

find 的时间参数:-mtime 与 -ctime

find 按时间筛选文件时有三个容易混淆的参数:

参数 含义
-mtime 文件内容最后一次被修改(modify)的时间
-ctime 文件的 inode 元数据(如权限、所有者、链接数)或内容最后一次变更(change)的时间
-atime 文件最后一次被读取(access)的时间

+30 表示”超过 30 天”,-30 表示”30 天以内”。注意修改文件内容会同时更新 mtime 和 ctime,但仅修改权限等元数据只会更新 ctime 而不动 mtime,所以 find /logs -type f -ctime +30 找到的通常就是那些长期没有被改动过的老文件。

更灵活的替代方案:crontab

如果不想把脚本放进 /etc/cron.daily(比如希望控制到具体的分钟),也可以用 crontab -e 为当前用户添加定时任务,例如每天凌晨 2 点执行:

0 2 * * * /path/to/logcron

两种方式任选其一即可,核心都是那条 find ... | xargs rm -rf


   转载规则


《定时删除 30 天前的文件:cron 与 find》 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
快速定位磁盘中的大文件 快速定位磁盘中的大文件
作为系统维护人员,你肯定遇到过硬盘被占满的情况。日志文件往往是占用大量磁盘空间的”罪魁祸首”,但要找出这些”隐形”的大块头并非易事。本文介绍几个高效的命令和工具,帮助你快速定位并管理这些占用空间的大文件。 用 du 查看磁盘使用情况du(d
2020-12-20
下一篇 
用 sed + grep 批量替换目录下文件中的字符串 用 sed + grep 批量替换目录下文件中的字符串
改代码时经常遇到这种需求:把整个工程里某个旧字符串全部替换成新的,比如交叉编译工具链从 arm-none-linux-gnueabi- 换成 arm-linux-。手工逐个文件改既慢又容易漏,用 sed 配合 grep 一条命令就能搞定。
2020-12-06
  目录