最稳妥的shell磁盘清理方式是用df -p精准提取分区使用率、剥离百分号后数值比较、配合条件分支执行可控清理。需指定挂载点、用-gt整数比较、加dry-run验证、压缩替代删除、记录日志并结合告警兜底。

直接用 df 提取使用率、数值比较、条件分支执行清理,是 Shell 流程控制中最稳妥的落地方式。关键不在“能不能做”,而在“怎么避免误判和误操作”——比如只盯特定分区、去掉百分号再比大小、加 dry-run 验证、清理前留日志。
精准提取目标分区使用率
别用 df -h | grep / 这类模糊匹配,容易错抓 rootfs 或其他挂载点。推荐明确指定设备或挂载路径:
-
df -P /var | awk 'NR==2 {gsub(/%/,"",$5); print $5}'—— 获取/var分区纯数字使用率(如 82) -
df -P | awk '$6 == "/home" {gsub(/%/,"",$5); print $5}'—— 按挂载点精确匹配,适配多分区环境 - 避免用
-h格式参与计算,因列数可能浮动;-P(POSIX 格式)保证列对齐稳定
用数值比较触发清理动作
Shell 中不能直接比带 % 的字符串,必须先剥离符号。if 判断要严格用 -gt(整数比较),不是 >(字符串比较):
used=$(df -P /var | awk 'NR==2 {gsub(/%/,"",$5); print $5}')if [ "$used" -gt 80 ]; then ... fi- 加空格保护变量:
"$used"防止为空时语法报错 - 可设阈值变量:
THRESHOLD=80,后续改值只需动一处
安全执行清理逻辑
清理不是删完就完事,得可控、可验、可追溯:
- 优先压缩而非删除:
find /var/log -name "*.log" -mtime +7 -size +10M -exec gzip {} \; - 加
DRY_RUN=1开关:脚本开头设变量,清理命令前加[ "$DRY_RUN" = "1" ] && echo "would run: ..." || ... - 清理后校验:
df -P /var | awk 'NR==2 {print $5}'看是否回落,再决定是否发告警 - 记录日志:
echo "$(date): cleaned logs, used now ${used_new}%" >> /var/log/disk_clean.log
结合告警与兜底机制
清理失败或空间仍高,就得通知人介入:
- 清理后再次检查:
if [ "$used_after" -gt 75 ]; then send_alert "cleanup failed"; fi - 告警渠道按需选:邮件用
mail -s "Disk Alert" admin@example.com,钉钉用curl -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"..."}' $WEBHOOK - 避免重复告警:加锁文件或时间戳判断,比如
[ -f /tmp/disk_alerted_$(date +%Y%m%d) ] || (touch /tmp/disk_alerted_$(date +%Y%m%d); send_alert)











