前言

一个简单的脚本用来清理磁盘空间,由 ChatGPT 创作,可以手动运行或者定时自动运行,只测试了 Ubuntu 和Debian。

创建脚本文件

1
sudo vim /usr/local/bin/cleanup.sh

写入脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/bin/bash

# ==========================
# 🔧 Debian/Ubuntu 系统清理脚本(带进度和释放百分比)
# 自动清理缓存、日志、临时文件、Docker、Snap 老版本及用户缓存
# ==========================

# 检查是否以 root 执行
if [ "$EUID" -ne 0 ]; then
echo "⚠️ 请使用 root 用户或 sudo 执行本脚本!"
exit 1
fi

# 获取清理前可用空间
before=$(df --output=avail -B1 / | tail -n1 | tr -d '[:space:]')
total_space=$(df --output=size -B1 / | tail -n1 | tr -d '[:space:]') # 总磁盘容量

# ---------- 1. APT ----------
apt-get update -qq
apt-get clean -qq
apt-get autoclean -qq
apt-get autoremove -y -qq

# ---------- 2. 系统日志 ----------
command -v journalctl &>/dev/null && journalctl --vacuum-time=7d || true
find /var/log -type f -name "*.log" -exec truncate -s 0 {} \; 2>/dev/null || true

# ---------- 3. 清理函数(带进度百分比) ----------
clean_dir() {
local dir="$1"
[ -d "$dir" ] || return
local files=("$dir"/*)
local total=${#files[@]}
[ "$total" -eq 0 ] && return
local count=0
for f in "${files[@]}"; do
rm -rf "$f" 2>/dev/null || true
count=$((count + 1))
percent=$((count * 100 / total))
echo -ne "\r⏳ 清理 $dir: ${percent}%"
done
echo -ne "\r⏳ 清理 $dir: 100%\n"
}

# ---------- 4. 临时文件 ----------
clean_dir /tmp
clean_dir /var/tmp

# ---------- 5. Snap 老版本 ----------
if command -v snap &>/dev/null; then
snaps=($(snap list --all | awk '/disabled/{print $1":"$2}'))
total=${#snaps[@]}
[ "$total" -gt 0 ] && echo "⏳ 清理 Snap 老版本..."
count=0
for s in "${snaps[@]}"; do
snapname="${s%%:*}"
revision="${s##*:}"
snap remove "$snapname" --revision="$revision" &>/dev/null || true
count=$((count + 1))
percent=$((count * 100 / total))
echo -ne "\r⏳ 清理 Snap: ${percent}%"
done
[ "$total" -gt 0 ] && echo -e "\r⏳ 清理 Snap: 100%"
fi

# ---------- 6. Docker ----------
command -v docker &>/dev/null && docker system prune -af &>/dev/null || true

# ---------- 7. 用户缓存 ----------
for user_home in /root /home/*; do
clean_dir "$user_home/.cache"
clean_dir "$user_home/.local/share/Trash"
done

# ---------- 输出结果 ----------
after=$(df --output=avail -B1 / | tail -n1 | tr -d '[:space:]')
released=$((after - before))

format_size() {
local bytes=$1
if [ "$bytes" -lt 1024 ]; then
echo "${bytes} B"
elif [ "$bytes" -lt 1048576 ]; then
awk "BEGIN {printf \"%.2f KB\", $bytes/1024}"
elif [ "$bytes" -lt 1073741824 ]; then
awk "BEGIN {printf \"%.2f MB\", $bytes/1024/1024}"
else
awk "BEGIN {printf \"%.2f GB\", $bytes/1024/1024/1024}"
fi
}

# 计算释放占比
released_percent=$(awk "BEGIN {printf \"%.2f\", $released*100/$total_space}")

if [ "$released" -le 0 ]; then
echo "✨ 系统清理完成!未释放可用空间。"
else
echo "✨ 系统清理完成!释放空间:$(format_size $released) (${released_percent}%) 💾 当前可用空间:$(format_size $after)"
fi

赋权

1
sudo chmod +x /usr/local/bin/cleanup.sh

手动运行脚本

1
cleanup.sh

定时运行脚本

  • 编辑 crontab
1
sudo crontab -e
  • 周日凌晨 3 点执行一次
1
0 3 * * 0 /usr/local/bin/cleanup.sh >> /var/log/cleanup.log 2>&1

后记

  • 每周日凌晨 3:00 执行脚本
  • 执行过程会记录到 /var/log/cleanup.log
  • 如果需要改频率,只需要调整前面的 0 3 * * 0