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:输出文件路径,便于核对
如果输出列表里有你不想删的文件,可以加上 ! 排除,例如排除
-nameerror.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 命令安全地批量清理旧日志,释放磁盘空间。
如果服务器上有多个日志目录,建议逐个目录处理,不要一次性对所有目录执行删除。