电脑越用越满?让 AI Agent 安全清掉 Windows 11、Ubuntu 26.04 和 macOS 26 的垃圾文件
先说结论
清理垃圾文件这件事,最怕的不是“清不干净”,而是“清得太猛”。Windows 11、Ubuntu 26.04、macOS 26 上真正值得自动化清理的,通常是临时目录、包管理缓存、旧日志、回收站或废纸篓、可再生成的缓存文件;不应该让脚本随手碰用户文档、照片、浏览器 Profile、密钥、证书、虚拟机镜像和业务数据。
这篇文章给出两条路:人工自动执行,也就是你自己复制脚本,先 dry-run 看清楚,再加执行开关;Agent 自动配置,也就是把清理目标、边界、预演、确认和验收交给 Codex、Claude、OpenClaw、HermesAgent 等 Agent 执行。三套脚本分别覆盖 Windows 11、Ubuntu 26.04、macOS 26,不依赖第三方服务,不下载清理软件,也不包含任何真实内网地址、真实计算机名、私有域名或密钥。

图 1:AI 生成封面。清理垃圾文件应该像分拣物品,不是把整间屋子一口气倒进垃圾桶。
一、问题背景:磁盘不是突然满的,而是一点点被“可再生成文件”占住的
很多电脑刚装好时很清爽,用半年以后就开始出现这些症状:系统盘剩余空间越来越少,更新失败,Docker 或虚拟机启动报空间不足,IDE 索引慢,备份软件提示目标盘不够,甚至浏览器下载一个大文件都失败。最烦的是,你打开文件管理器看一圈,好像也没存多少东西。
这类问题常见于三种机器。第一种是 Windows 11 日常办公机,系统更新、临时安装包、应用缓存、回收站、缩略图缓存越积越多。第二种是 Ubuntu 26.04 开发机或服务器,APT 缓存、旧依赖包、systemd journal、临时目录、旧 Snap revision 慢慢堆起来。第三种是 macOS 26 笔记本,用户缓存、日志、废纸篓、Xcode 或开发工具残留、下载目录里的旧安装包把空间吃掉。
可以把磁盘想象成一个书包。真正的课本、作业本、钥匙和证件要留下;包装袋、草稿纸、过期传单可以扔;但如果你让一个很勤快的人闭着眼睛“帮我减重”,他可能会把作业本也扔掉。AI Agent 的价值不是“比人更敢删”,而是“比人更愿意先盘点、分类、记录,再按规则执行”。
图 2:推荐顺序是体检、分拣、预演、清运、复查。跳过预演直接删除,是多数误删事故的开始。
二、问题表现:你以为是电脑变慢,实际可能是空间治理失控
垃圾文件堆积的表现不一定是“磁盘已满”四个字。更常见的是一些间接信号:系统更新下载到一半失败;应用升级后留下多个旧版本;日志目录突然变成几十 GB;/var 或系统盘接近 100%;macOS 的“系统数据”看起来很大;Windows 更新后 C 盘少了很多;编译缓存或包管理缓存让备份时间变长。
这些表现背后的共同点,是“文件本身不一定有业务价值,但系统暂时没有主动清走”。缓存不是坏东西。缓存像厨房里的备用餐具,平时能省时间;但如果每次外卖盒、包装袋、旧菜单都留着,厨房再大也会被塞满。清理的目标不是消灭缓存,而是让缓存遵守边界:该过期就过期,该重建就重建,该保留的配置和数据绝不能误伤。
对普通用户来说,最容易踩的坑有三个:第一,网上下载所谓“一键深度清理工具”,它到底删了什么不可控;第二,照抄别人脚本里的 rm -rf 或 Remove-Item -Recurse,没有 dry-run;第三,把“Downloads 目录里很多东西”当作垃圾,但里面可能有合同、照片、安装包、证书或离线资料。
三、问题分析:AI Agent 适合做清理,但必须戴上护栏
AI Agent 很适合清理垃圾文件,因为它擅长重复检查、汇总空间占用、生成脚本、执行前后对比、整理日志。让人手工查十几个目录很枯燥,让 Agent 做就很合适。但 Agent 不应该替你决定所有文件的命运。它适合当“仓库管理员”,先盘点、贴标签、列清单;不适合一上来就当“拆迁队”。
本文的三套脚本都遵守同一个原则:默认只预演,不真正删除。Windows 脚本需要加 -Execute 才执行;Ubuntu 脚本需要设置 EXECUTE=1;macOS 脚本也需要设置 EXECUTE=1。这就像请保洁阿姨先把要扔的东西堆到门口,让你看一眼,再真正丢掉。
图 3:三个系统名字不同,本质类似:临时文件、包缓存、日志、回收站/废纸篓可以清;个人资料和密钥不要自动碰。
官方工具也能说明这个方向。Windows 自带 cleanmgr,用于磁盘清理;Ubuntu 官方 manpage 里 apt-get clean/autoclean/autoremove 面向包缓存和不再需要的依赖;journalctl 支持按时间或大小压缩 systemd journal;Apple Support 也建议从系统存储管理、废纸篓、下载和不需要的文件入手,而不是用来历不明的清理器。

图 4:Windows 侧优先调用系统内置能力和明确路径,不依赖第三方清理软件。
四、根因:垃圾文件不是一种文件,而是一类“可丢弃状态”
很多人问“哪个目录可以删”,这个问题本身就有风险。因为目录只是位置,真正要判断的是文件的状态。比如缓存文件可以删,是因为应用能重新生成;日志可以压缩,是因为过旧日志排障价值降低;APT 包缓存可以清,是因为需要时可以重新下载;回收站可以清,是因为文件已经被用户主动删除过一次。
反过来,Downloads 目录并不天然是垃圾。它只是“下载目录”,里面可能有临时安装包,也可能有唯一副本。浏览器 Profile 也不应该当垃圾,因为里面可能有书签、扩展配置、登录状态。开发工具缓存则更复杂:删了通常能重建,但会导致下一次编译或索引很慢,所以最好由用户按项目决定。
这就是为什么文章里的脚本刻意保守。它们主要清理:系统临时目录、用户临时目录、超过指定天数的临时文件、回收站/废纸篓、APT 缓存、不再需要的 Debian 包、systemd journal 旧日志、禁用的旧 Snap revision、用户级 Caches 和 Logs 中较老的文件。它们不会自动扫描整个硬盘找“大文件然后删除”。

图 5:Linux 清理不要从 rm -rf /var 开始,应先使用包管理器和日志系统提供的清理入口。
五、人工自动执行:三套一键脚本
下面三套脚本都不依赖第三方服务。建议先复制到本机,以 dry-run 模式运行,确认输出合理后再执行。脚本里的 <...> 都是占位符,本文不会也不应该出现任何真实内网地址、真实主机名、私有域名或密钥。
5.1 Windows 11:PowerShell 保守清理脚本
保存为 Clean-Windows11-Junk.ps1,先在管理员 PowerShell 中运行:
powershell -ExecutionPolicy Bypass -File .\Clean-Windows11-Junk.ps1
确认清单后再执行:
powershell -ExecutionPolicy Bypass -File .\Clean-Windows11-Junk.ps1 -Execute -Days 14
脚本如下:
param(
[switch]$Execute,
[int]$Days = 14
)
$ErrorActionPreference = "Stop"
$DryRun = -not $Execute
$Cutoff = (Get-Date).AddDays(-$Days)
$FreedBytes = 0
function Format-Bytes([Int64]$Bytes) {
if ($Bytes -ge 1GB) { return "{0:N2} GB" -f ($Bytes / 1GB) }
if ($Bytes -ge 1MB) { return "{0:N2} MB" -f ($Bytes / 1MB) }
if ($Bytes -ge 1KB) { return "{0:N2} KB" -f ($Bytes / 1KB) }
return "$Bytes B"
}
function Get-FileSizeSafe($Item) {
try { return [int64]$Item.Length } catch { return 0 }
}
function Clean-Folder($Path, [string]$Label) {
if (-not (Test-Path $Path)) { return }
Write-Host "`n[$Label] $Path"
$items = Get-ChildItem -LiteralPath $Path -Force -ErrorAction SilentlyContinue |
Where-Object { -not ($_.Attributes -band [IO.FileAttributes]::ReparsePoint) -and $_.LastWriteTime -lt $Cutoff }
foreach ($item in $items) {
$size = 0
if ($item.PSIsContainer) {
$size = (Get-ChildItem -LiteralPath $item.FullName -Recurse -Force -ErrorAction SilentlyContinue |
Where-Object { -not $_.PSIsContainer } |
ForEach-Object { Get-FileSizeSafe $_ } |
Measure-Object -Sum).Sum
} else {
$size = Get-FileSizeSafe $item
}
if (-not $size) { $size = 0 }
Write-Host (" {0} {1}" -f (Format-Bytes $size), $item.FullName)
if (-not $DryRun) {
try {
Remove-Item -LiteralPath $item.FullName -Recurse -Force -ErrorAction Stop
$script:FreedBytes += [int64]$size
} catch {
Write-Warning "Failed to remove: $($item.FullName) - $($_.Exception.Message)"
}
}
}
}
Write-Host "Mode: $(if ($DryRun) { 'DRY-RUN' } else { 'EXECUTE' })"
Write-Host "Only items older than $Days days are considered."
Get-PSDrive -PSProvider FileSystem | Format-Table Name, Used, Free
Clean-Folder $env:TEMP "User temp"
Clean-Folder "$env:WINDIR\Temp" "Windows temp"
Clean-Folder "$env:LOCALAPPDATA\Temp" "Local app temp"
Clean-Folder "$env:LOCALAPPDATA\Microsoft\Windows\INetCache" "Browser/system cache"
if ($DryRun) {
Write-Host "`n[Recycle Bin] Dry-run only. Use -Execute to empty it."
} else {
try { Clear-RecycleBin -Force -ErrorAction Stop } catch { Write-Warning $_.Exception.Message }
try { Start-Process cleanmgr.exe -ArgumentList "/verylowdisk" -Wait } catch { Write-Warning $_.Exception.Message }
}
Write-Host "`nEstimated removed in script-controlled paths: $(Format-Bytes $FreedBytes)"
Write-Host "Done. Review warnings before treating the cleanup as successful."
这个脚本没有扫描用户文档,也没有删除浏览器 Profile。它像只倒垃圾桶和擦桌面,不会打开抽屉翻你的证件。cleanmgr /verylowdisk 只在执行模式调用,因为它不是 dry-run 工具。
5.2 Ubuntu 26.04:Bash 保守清理脚本
保存为 clean-ubuntu2604-junk.sh。先预演:
bash clean-ubuntu2604-junk.sh
确认后执行:
EXECUTE=1 DAYS=14 JOURNAL_KEEP=14d bash clean-ubuntu2604-junk.sh
脚本如下:
#!/usr/bin/env bash
set -euo pipefail
EXECUTE="${EXECUTE:-0}"
DAYS="${DAYS:-14}"
JOURNAL_KEEP="${JOURNAL_KEEP:-14d}"
DRY_RUN=1
if [ "$EXECUTE" = "1" ]; then DRY_RUN=0; fi
run() {
if [ "$DRY_RUN" = "1" ]; then
printf '[dry-run] %q ' "$@"; printf '
'
else
"$@"
fi
}
need_sudo() {
if [ "$(id -u)" -eq 0 ]; then "$@"; else sudo "$@"; fi
}
echo "Mode: $([ "$DRY_RUN" = "1" ] && echo DRY-RUN || echo EXECUTE)"
echo "Before:"; df -h / /var 2>/dev/null || df -h /
echo
echo "[APT] simulation for autoremove"
need_sudo apt-get -s autoremove --purge || true
if [ "$DRY_RUN" = "0" ]; then
need_sudo apt-get autoremove --purge -y
need_sudo apt-get autoclean -y
need_sudo apt-get clean
else
echo "[dry-run] apt-get autoremove/autoclean/clean will run only with EXECUTE=1"
fi
echo
if command -v journalctl >/dev/null 2>&1; then
echo "[journal] current usage"
journalctl --disk-usage || true
if [ "$DRY_RUN" = "0" ]; then
need_sudo journalctl --vacuum-time="$JOURNAL_KEEP"
else
echo "[dry-run] journalctl --vacuum-time=$JOURNAL_KEEP"
fi
fi
echo
for dir in /tmp /var/tmp; do
[ -d "$dir" ] || continue
echo "[temp] $dir files older than $DAYS days"
if [ "$DRY_RUN" = "1" ]; then
find "$dir" -xdev -mindepth 1 -mtime +"$DAYS" -print 2>/dev/null | head -200
else
need_sudo find "$dir" -xdev -mindepth 1 -mtime +"$DAYS" -print -delete 2>/dev/null || true
fi
done
echo
if command -v snap >/dev/null 2>&1; then
echo "[snap] disabled revisions"
snap list --all | awk '/disabled/{print $1, $3}' || true
if [ "$DRY_RUN" = "0" ]; then
snap list --all | awk '/disabled/{print $1, $3}' | while read -r snapname revision; do
[ -n "$snapname" ] && [ -n "$revision" ] && need_sudo snap remove "$snapname" --revision="$revision"
done
else
echo "[dry-run] disabled snap revisions will be removed only with EXECUTE=1"
fi
fi
echo
echo "After candidate cleanup:"; df -h / /var 2>/dev/null || df -h /
echo "Done. If this is a server, review service logs before and after cleanup."
Ubuntu 脚本的重点是先找官方入口:包交给 APT,日志交给 journalctl,临时目录按天数处理。不要把 /var 当成一个可以随便清空的大垃圾桶,因为里面也有数据库、队列、容器、日志和应用状态。

图 6:日志清理应该让日志系统自己做,避免直接删除正在使用的 journal 文件。
5.3 macOS 26:zsh 保守清理脚本
保存为 clean-macos26-junk.zsh。先预演:
zsh clean-macos26-junk.zsh
确认后执行:
EXECUTE=1 DAYS=14 EMPTY_TRASH=1 zsh clean-macos26-junk.zsh
脚本如下:
#!/bin/zsh
set -euo pipefail
EXECUTE="${EXECUTE:-0}"
DAYS="${DAYS:-14}"
EMPTY_TRASH="${EMPTY_TRASH:-0}"
DRY_RUN=1
[[ "$EXECUTE" == "1" ]] && DRY_RUN=0
print_mode() { [[ "$DRY_RUN" == "1" ]] && echo "DRY-RUN" || echo "EXECUTE"; }
run_or_print() {
if [[ "$DRY_RUN" == "1" ]]; then
printf '[dry-run]'; printf ' %q' "$@"; printf '
'
else
"$@"
fi
}
clean_dir() {
local dir="$1"
local label="$2"
[[ -d "$dir" ]] || return 0
echo "
[$label] $dir"
if [[ "$DRY_RUN" == "1" ]]; then
find "$dir" -xdev -mindepth 1 -mtime +"$DAYS" -print 2>/dev/null | head -200 || true
else
find "$dir" -xdev -mindepth 1 -mtime +"$DAYS" -print -delete 2>/dev/null || true
fi
}
echo "Mode: $(print_mode)"
echo "Only user-level cache/log/temp files older than $DAYS days are considered."
df -h /
clean_dir "$HOME/Library/Caches" "User caches"
clean_dir "$HOME/Library/Logs" "User logs"
clean_dir "$TMPDIR" "User temp"
clean_dir "$HOME/Downloads" "Downloads candidates only; review carefully"
if [[ "$EMPTY_TRASH" == "1" ]]; then
if [[ "$DRY_RUN" == "1" ]]; then
echo "
[dry-run] Trash would be emptied with EXECUTE=1 EMPTY_TRASH=1"
find "$HOME/.Trash" -mindepth 1 -maxdepth 2 -print 2>/dev/null | head -100 || true
else
rm -rf "$HOME/.Trash/"* "$HOME/.Trash/".[!.]* "$HOME/.Trash/"..?* 2>/dev/null || true
fi
else
echo "
[Trash] skipped. Set EMPTY_TRASH=1 if you really want to empty it."
fi
echo "
After candidate cleanup:"
df -h /
echo "Done. Do not automate deletion of Photos libraries, browser profiles, keychains, or virtual machine images."
macOS 的“系统数据”经常让人焦虑,但它不是一个可以直接 rm -rf 的目录。更稳的做法是先清用户级缓存、日志、临时目录、废纸篓和明确不需要的下载残留。Apple 的存储管理建议也更接近这种思路:从系统提供的入口和用户可判断的文件开始。

图 7:macOS 侧不要迷信“系统数据一键归零”,先从官方存储建议和用户可判断文件入手。
六、Agent 自动配置:直接复制这段任务给 Agent
如果你想让 AI Agent 直接帮你做,可以给它下面这段提示词。注意,这段提示词刻意要求“先预演、再确认、再执行”。
请协助我清理当前机器上的垃圾文件,目标系统是 <Windows 11 / Ubuntu 26.04 / macOS 26>。
要求:
1. 不允许联网下载第三方清理工具,不允许调用不明脚本。
2. 不允许删除用户文档、照片、浏览器 Profile、密钥、证书、虚拟机镜像、业务数据目录。
3. 先识别系统版本、磁盘占用、主要缓存/日志/临时目录,只输出脱敏结果。
4. 先生成 dry-run 清单,列出将要清理的路径、类型、估算大小和风险等级。
5. 在我明确确认前,不允许真正删除。
6. 确认后只执行内置工具和本文脚本:Windows 使用 PowerShell 与 cleanmgr;Ubuntu 使用 apt-get、journalctl、find、snap;macOS 使用 zsh、find、Trash/Caches/Logs。
7. 清理后输出前后空间对比、失败项、跳过项、后续人工检查建议。
8. 最终报告中不要出现完整 IP 地址、完整计算机名、私有域名、token、密码、密钥或真实用户名。
图 8:Agent 不怕复杂,怕没有边界。把权限、路径、预演、执行和验收写清楚,自动化才可靠。
我更建议把 Agent 任务拆成两个回合。第一回合只做只读检查和 dry-run,第二回合在人确认后执行。这样做看似慢一点,实际更快,因为误删后恢复文件、解释事故、找备份,才是真的慢。
七、哪些东西千万不要自动清理
任何清理文章都应该把“不要做什么”说清楚。下面这些对象不建议自动删除:
- 用户文档、桌面、图片、照片库、音乐库、视频库。
- 浏览器 Profile、密码库、书签、扩展配置、Cookie、登录状态。
- SSH key、证书、Keychain、
.gnupg、.ssh、云盘同步目录。 - 虚拟机镜像、容器卷、数据库目录、项目源码目录。
- 不认识的大文件,尤其是只有一份的安装包、备份包、导出文件。
- 业务服务正在写入的日志和数据目录。
打个比方,清理电脑像打扫房间。扫地、倒垃圾、扔外卖盒没问题;但不能因为抽屉里东西多,就把身份证、房本、钥匙一起倒掉。自动化脚本应该清理“明显可再生成或已被系统标记为可清理”的东西,而不是替你判断人生资料有没有价值。
图 9:保守清理不是不专业,而是把误删风险放在第一优先级。
八、Q&A
Q1:为什么不推荐第三方清理软件?
不是所有第三方工具都不好,而是本文目标是可审计、可复现、无第三方服务依赖。系统内置工具和脚本更容易看清楚做了什么,也更适合交给 Agent 执行和复查。
Q2:为什么脚本默认不删除?
因为清理脚本最重要的能力不是删除,而是“解释自己准备删除什么”。默认 dry-run 能让人先看到候选清单,避免把误删风险藏在漂亮的一键按钮后面。
Q3:清理后空间没有明显变多,是不是脚本没用?
不一定。很多机器真正占空间的是照片、虚拟机、Docker 镜像、游戏、开发依赖或下载目录里的大文件。保守脚本不会自动删除这些,因为它们可能有业务价值。脚本的价值是先处理低风险区域,再告诉你下一步该人工看哪里。
Q4:Ubuntu 服务器能不能直接清 /var/log?
不建议直接删正在使用的日志文件。systemd journal 用 journalctl --vacuum-time 或 --vacuum-size,传统日志要先确认 logrotate 策略。直接删除可能不释放空间,因为进程仍然打开旧文件句柄。
Q5:macOS 的“系统数据”很大,能不能强行删除?
不建议。macOS 的系统数据包含缓存、快照、应用支持文件等多种内容。先用系统存储管理、清废纸篓、删明确不需要的下载残留、清用户缓存和日志。无法判断的内容不要交给脚本硬删。

图 10:macOS 26 对应 Tahoe 版本,清理策略仍应以系统内置能力和可审计路径为主。
九、我的推荐流程
如果只是日常维护,我建议这样做:每月跑一次 dry-run,看候选项;每季度执行一次保守清理;系统大版本升级前额外清一次包缓存、旧日志和临时文件;清理前后保留空间截图或命令输出。对于服务器,清理前先确认备份、服务状态和日志策略;对于个人电脑,清理前先检查下载目录和废纸篓里是否有唯一副本。
AI Agent 可以把这些步骤变得不烦,但不能替代人的判断。最好的自动化不是“我什么都不用管”,而是“重复、枯燥、容易漏的检查交给 Agent;价值判断、确认删除、异常取舍仍由人负责”。这样用,AI Agent 才是整理书包的小助手,而不是拿着垃圾袋冲进卧室的人。
参考资料
- Microsoft Learn:
cleanmgrcommand: https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cleanmgr - Ubuntu Manpage:
apt-get: https://manpages.ubuntu.com/manpages/resolute/en/man8/apt-get.8.html - Ubuntu Manpage:
journalctl: https://manpages.ubuntu.com/manpages/resolute/en/man1/journalctl.1.html - Apple Support: Free up storage space on Mac: https://support.apple.com/en-us/102624
- Apple Developer: macOS Tahoe 26 Release Notes: https://developer.apple.com/documentation/macos-release-notes/macos-26-release-notes