一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

macOS 如何在 Shell 脚本中自动清理超过三十天的旧日志文件

时间:2026-08-11 09:58:49 编辑:袖梨 来源:一聚教程网

可用 find 命令配合 -mtime +30 清理三类日志目录(/var/log、/Library/Logs、~/Library/Logs),但需避开 Unified Logging 管理区(/var/db/diagnostics 等),并用 sudo log erase 操作;脚本支持预览与定时执行,兼顾安全与自动化。

直接用 find 命令配合 -mtime +30 就能精准定位并删除,但 macOS 日志结构分层明显,不能一刀切。重点清理三类路径,同时避开系统统一日志(/var/db/diagnostics)这类受 log 命令管理的区域,否则可能影响诊断功能。

明确可安全清理的目录范围

以下路径中文件大多无自动轮转机制,长期积累易占数 GB 空间:

  1. /var/log/:系统级日志归档(如 system.log.0.gzinstall.log.old
  2. /Library/Logs/:全局服务日志(Xcode、Apache、Homebrew 服务等)
  3. ~/Library/Logs/:当前用户应用日志(Slack、Docker Desktop、VS Code 扩展等)

⚠️ 注意:/var/db/diagnostics/var/db/uuidtext 属 Unified Logging 数据库,必须用 sudo log erase 操作,不可用 rm 直删。

脚本核心写法(保留最近30天)

保存为 clean-old-logs.sh,内容如下:

#!/bin/zsh

LOG_DIRS=( "/var/log" "/Library/Logs" "$HOME/Library/Logs" )

for dir in "${LOG_DIRS[@]}"; do if [[ -d "$dir" ]]; then echo "? 清理 $dir 中 30 天前的日志文件"

删除 .log 文件(非正在写入的)
find "$dir" -type f -name "*.log" -mtime +30 -delete 2>/dev/null# 删除压缩归档和旧格式(.gz / .old)find "$dir" -type f ( -name "*.gz" -o -name "*.old" ) -mtime +30 -delete 2>/dev/null

fi done

echo " 清理完成。建议运行 'du -sh /var/log /Library/Logs ~/Library/Logs' 查看空间释放效果。"

? 关键说明:

  1. -mtime +30 表示“修改时间超过 30 整天”,即至少 31 天前的文件
  2. 2>/dev/null 屏蔽权限不足等无关报错,保持输出干净
  3. 运行前可先用 -print 替代 -delete 预览将删哪些文件,例如:

    find "$dir" -type f -name "*.log" -mtime +30 -print

搭配系统级日志管理更省心

单靠脚本是治标,还需启用 macOS 原生机制减少源头产出:

  1. 执行 sudo log config --mode "level:default,mode:stream" 确保 Unified Logging 正常工作
  2. 对常用开发工具(如 Docker、Node.js 进程),启动时加 --log-level=warn 或配置其自身日志保留策略
  3. 检查 /etc/newsyslog.conf 是否启用轮转(默认开启),避免 /var/log 下日志无限膨胀

定时执行只需一条 cron

让脚本每月1号凌晨自动跑一次:

crontab -e# 添加这一行:0 3 1 * * /path/to/clean-old-logs.sh >/dev/null 2>&1

其中 0 3 1 * * 表示每月1日 3:00 执行;/path/to/... 替换为你脚本的实际路径;重定向确保不产生邮件通知。

不复杂但容易忽略细节,关键在区分日志类型、留出预览步骤、再配好定时节奏。

热门栏目