一、背景:为什么需要定期清理?
在现代软件系统中,尤其是涉及物联网设备、视频监控、AI推理或事件驱动架构的项目中,服务器每天都会产生大量数据。这些数据通常包括:
- 日志文件 (如
.log、.json):记录系统运行状态、错误信息或用户行为; - 图片文件 (如
.jpg、.png):由摄像头、截图工具或图像处理模块生成; - 视频片段 (如
.mp4、.avi):用于事件回放或临时缓存。
这些文件虽然在短期内有重要价值,但长期保留不仅占用宝贵的磁盘空间,还可能带来以下风险:
🔴 磁盘空间耗尽 → 系统无法写入新数据 → 服务崩溃甚至服务器宕机!
尤其在资源受限的边缘服务器或云主机上,磁盘容量往往有限(例如 50GB 或 100GB)。若不加以管理,短短几周就可能被海量媒体文件"撑爆"。

因此,建立一套自动化的清理机制,及时删除过期无用的数据,是保障系统稳定运行的关键措施。
二、解决方案:使用 find 命令精准清理
Linux 系统提供了强大的文件查找工具 find,它不仅能定位文件,还能直接执行删除操作。下面介绍两条高效、安全的清理命令。
1. 删除超过 11 天的指定类型文件
bash
find . -maxdepth 3 -type f $ -name "*.mp4" -o -name "*.jpg" -o -name "*.json" $ -mtime +11 -delete
命令解析:
.:从当前目录开始搜索;-maxdepth 3:最多深入 3 层子目录,避免误扫深层未知结构;-type f:仅匹配普通文件(排除目录);$...$:逻辑分组,确保多个-name条件被正确组合;-name "*.mp4"、-name "*.jpg"、-name "*.json":只处理这三类文件; ⚠️ 注意:必须写成*.json,而不是.json,否则只会匹配名为.json的隐藏文件,无法删除event_2025.json这类正常文件。-mtime +11:文件修改时间 超过 11 天(即 12 天前及更早);-delete:直接删除匹配项。
✅ 效果:每天自动清理 11 天前的视频、图片和元数据,释放磁盘空间。
💡 安全建议 :首次运行时,先去掉
-delete,确认输出是否符合预期:
bashfind . -maxdepth 3 -type f $ -name "*.mp4" -o -name "*.jpg" -o -name "*.json" $ -mtime +11
2. 清理因文件删除而产生的空目录
bash
find . -depth -type d -empty -delete
命令解析:
-depth:采用 深度优先遍历,先处理子目录,再处理父目录;-type d:只匹配目录;-empty:仅选择完全为空的目录(无文件、无子目录);-delete:删除这些空目录。
✅ 作用:在删除大量文件后,很多中间目录会变为空壳。此命令能自动"打扫战场",保持目录结构整洁,避免留下大量无用空文件夹。
🌰 举例:
删除
/c/XXXX/cam01/2025-01-01/video.mp4后,2025-01-01目录变空。若
cam01下再无其他内容,该命令也会将cam01一并删除。
三、自动化执行:配置定时任务(Cron)
手动执行清理命令显然不现实。我们需要让系统 每天自动运行 这些命令。Linux 的 cron 服务正是为此设计。

1. 什么是 Cron?
cron 是 Linux 内置的定时任务调度器,可按分钟、小时、天等周期自动执行命令或脚本。
2. 编写定时任务规则
Cron 表达式格式为:
分 时 日 月 星期 命令
例如:
0 1 * * *→ 每天凌晨 1:000 2 * * *→ 每天凌晨 2:00
3. 添加任务到 Crontab
步骤 1:编辑当前用户的定时任务
bash
crontab -e
首次运行可能会提示选择编辑器(推荐
nano或vim)。
步骤 2:添加以下两行(注意路径和命令完整性)
bash
# 每天凌晨 1 点:删除 /c/events 下超过 11 天的 .mp4/.jpg/.json 文件
0 1 * * * cd /c/XXXX && /usr/bin/find . -maxdepth 3 -type f $ -name "*.mp4" -o -name "*.jpg" -o -name "*.json" $ -mtime +11 -delete
# 每天凌晨 2 点:删除残留的空目录
0 2 * * * cd /c/XXXX && /usr/bin/find . -depth -type d -empty -delete
✅ 关键细节:
- 使用
cd /c/events && ...确保工作目录正确;- 使用
/usr/bin/find(通过which find确认实际路径),避免 cron 环境变量缺失导致命令找不到;- 两条任务错开 1 小时,确保先删文件、再删目录,逻辑严谨。
步骤 3:保存并退出
- 在
nano中按Ctrl+O回车保存,Ctrl+X退出; - 在
vim中输入:wq保存退出。
系统会自动加载新任务,无需重启服务。
4. 验证与调试
-
查看当前用户的定时任务:
bashcrontab -l -
查看 cron 执行日志(用于排查失败原因):
bash# Ubuntu/Debian sudo grep CRON /var/log/syslog # CentOS/RHEL sudo tail -f /var/log/cron -
添加日志记录(推荐):
bash0 1 * * * cd /c/XXXX && /usr/bin/find ... -delete >> /var/log/cleanup.log 2>&1 0 2 * * * cd /c/XXXX && /usr/bin/find ... -delete >> /var/log/cleanup.log 2>&1

四、总结

面对有限的服务器磁盘资源,"生成---使用---清理" 的闭环管理至关重要。本文提供的方案:
- 精准识别:只删除指定类型、超过 11 天的文件;
- 彻底清理:连带清除空目录,不留垃圾;
- 自动执行:通过 cron 每天定时运行,无需人工干预;
- 安全可靠:限制搜索深度、使用绝对路径、错峰执行。
只需几分钟配置,即可大幅降低因磁盘爆满导致的服务中断风险。对于任何长期运行的项目,这都是一项值得投入的基础运维实践。
🛠️ 行动建议 :
立即检查你的服务器磁盘使用情况(
df -h),若/或数据盘使用率超过 80%,请尽快部署类似清理策略!
