Linux find命令批量删除旧日志

服务器磁盘空间被旧日志占满是很常见的问题,手动一个个删既慢又容易误删。
用 Linux find 命令按时间筛选并批量删除旧日志,可以安全快速地释放空间。
本文面向零基础运维,从预览到删除逐步操作,并给出避坑和验证方法,跟着做就能完成清理。

操作前先确认日志目录和磁盘状态

开始清理前,先搞清楚两件事:磁盘到底被谁占用了,以及日志放在哪里。

用 df -h 查看磁盘使用率,找到接近 100% 的分区:

df -h

再用 du 按目录从大到小排序,定位占用最大的日志目录:

du -sh /var/log/* | sort -rh | head -10

确认要清理的目录,例如 /var/log/nginx/ 或 /data/logs/。不要直接对 / 根目录执行删除,范围太大容易误删系统文件。

如果日志目录里还有正在被服务写入的当前日志,建议先只处理带日期后缀的历史文件,比如 access.log-20240101 这类。

用 find 按时间筛选旧日志并预览

find 命令的核心是按“修改时间”筛选文件,常用参数是 -mtime。-mtime +30 表示修改时间在 30 天以前的文件。

先只打印文件名,确认筛选结果符合预期,这一步不要加删除动作:

find /var/log/nginx/ -type f -name "*.log" -mtime +30 -print

参数说明:

  • /var/log/nginx/:要查找的目录
  • -type f:只找普通文件,排除目录
  • -name "*.log":只匹配 .log 结尾的文件
  • -mtime +30:修改时间超过 30 天
  • -print:输出文件路径,便于核对

如果输出列表里有你不想删的文件,可以加上 !
-name
排除,例如排除 error.log:

find /var/log/nginx/ -type f -name "*.log" ! -name "error.log" -mtime +30 -print

确认列表无误后再进行下一步。

执行批量删除并处理特殊文件名

最直接的删除方式是使用 -delete,它比 -exec rm 更安全,因为它只删除 find 找到的文件:

find /var/log/nginx/ -type f -name "*.log" -mtime +30 -delete

如果日志文件名包含空格或特殊字符,用 -exec 配合 rm -f 更稳妥:

find /var/log/nginx/ -type f -name "*.log" -mtime +30 -exec rm -f {} \;

对于大量文件,-exec 逐个调用 rm 会慢,可以用 + 代替 \; 批量传递:

find /var/log/nginx/ -type f -name "*.log" -mtime +30 -exec rm -f {} +

重要提醒:删除操作不可恢复,务必先执行预览命令确认列表,再执行删除。

避坑要点:权限、正在写入的文件和误删风险

删除旧日志时有几个容易踩的坑:

  • 权限不足:如果提示 Permission denied,说明当前用户对目录没有写权限。用 sudo 提权,或切换到 root 用户执行。
  • 误删当前日志:服务正在写入的日志文件被删除后,进程可能仍持有文件句柄,磁盘空间不会立即释放。建议只删除带历史日期后缀的文件,或先重启相关服务。
  • 删除范围过大:-mtime +30 中的数字根据实际情况调整,不要为了省事改成 +1 或 +7,可能删掉还需要排查问题的日志。
  • 通配符匹配过宽:-name "*.log" 会匹配所有 .log 文件,如果目录里有重要日志,用 ! -name 排除。
  • 没有备份:如果日志可能用于审计或排查,删除前先压缩归档到其他磁盘。

验证清理效果和磁盘空间变化

删除完成后,重新查看磁盘使用率:

df -h

对比清理前后的 Use%,确认空间已经释放。
如果空间没有明显变化,可能是被删除的文件仍被进程占用,用 lsof | grep deleted 查看,然后重启对应服务。

再次用 find 确认旧日志已经不存在:

find /var/log/nginx/ -type f -name "*.log" -mtime +30 -print

如果没有任何输出,说明 30 天以上的旧日志已经清理干净。

常见疑问

find 的 -mtime 和 -mmin 有什么区别?
-mtime 按天计算,-mmin 按分钟计算。清理旧日志通常用 -mtime,如果要删除几分钟前的临时文件才用 -mmin。

删除后磁盘空间没释放怎么办?
检查是否有进程仍占用已删除文件,用 lsof | grep deleted 找到进程,重启对应服务即可释放。

可以写成定时任务自动清理吗?
可以。把删除命令写入 crontab,例如每天凌晨 3 点执行一次。建议先用预览模式跑一段时间,确认筛选规则无误后再加 -delete。

find 删除和 logrotate 有什么区别?
logrotate 是系统自带的日志轮转工具,适合按周期切割、压缩和删除日志;find 更适合临时清理或对已有历史日志做批量处理。两者可以配合使用。

按本文步骤先预览、再删除、后验证,就能用 find 命令安全地批量清理旧日志,释放磁盘空间。
如果服务器上有多个日志目录,建议逐个目录处理,不要一次性对所有目录执行删除。

分享到:
上一篇
Redis大key排查清理,避免缓存卡顿
下一篇
Linux curl命令测试网站
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意