disk-hygiene

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Disk Hygiene

磁盘维护

Audit disk usage, clean developer caches, find forgotten large files, and triage Downloads on macOS.
审计磁盘占用情况、清理开发者缓存、查找被遗忘的大文件,以及整理macOS上的下载文件夹。

When to Use This Skill

何时使用此技能

Use this skill when:
  • User asks about disk space, storage, or cleanup
  • System is running low on free space
  • User wants to find old/forgotten large files
  • User wants to clean developer caches (brew, uv, pip, npm, cargo)
  • User wants to triage their Downloads folder
  • User asks about disk analysis tools (dust, dua, gdu, ncdu)
当出现以下情况时使用此技能:
  • 用户询问磁盘空间、存储或清理相关问题
  • 系统可用空间不足
  • 用户想要查找旧的/被遗忘的大文件
  • 用户想要清理开发者缓存(brew、uv、pip、npm、cargo)
  • 用户想要整理其下载文件夹
  • 用户询问磁盘分析工具(dust、dua、gdu、ncdu)

TodoWrite Task Templates

TodoWrite任务模板

Template A - Full Disk Audit

模板A - 完整磁盘审计

1. Run disk overview (df -h / and major directories)
2. Audit developer caches (uv, brew, pip, npm, cargo, rustup, Docker)
3. Scan for forgotten large files (>50MB, not accessed in 180+ days)
4. Present findings with AskUserQuestion for cleanup choices
5. Execute selected cleanups
6. Report space reclaimed
1. Run disk overview (df -h / and major directories)
2. Audit developer caches (uv, brew, pip, npm, cargo, rustup, Docker)
3. Scan for forgotten large files (>50MB, not accessed in 180+ days)
4. Present findings with AskUserQuestion for cleanup choices
5. Execute selected cleanups
6. Report space reclaimed

Template B - Cache Cleanup Only

模板B - 仅缓存清理

1. Measure current cache sizes
2. Run safe cache cleanups (brew, uv, pip, npm)
3. Report space reclaimed
1. Measure current cache sizes
2. Run safe cache cleanups (brew, uv, pip, npm)
3. Report space reclaimed

Template C - Downloads Triage

模板C - 下载文件夹整理

1. List Downloads contents with dates and sizes
2. Categorize into groups (media, dev artifacts, personal docs, misc)
3. Present AskUserQuestion multi-select for deletion/move
4. Execute selected actions
1. List Downloads contents with dates and sizes
2. Categorize into groups (media, dev artifacts, personal docs, misc)
3. Present AskUserQuestion multi-select for deletion/move
4. Execute selected actions

Template D - Forgotten File Hunt

模板D - 遗忘文件查找

1. Scan home directory for large files not accessed in 180+ days
2. Group by location and type (media, ISOs, dev artifacts, documents)
3. Present findings sorted by size
4. Offer cleanup options via AskUserQuestion

1. Scan home directory for large files not accessed in 180+ days
2. Group by location and type (media, ISOs, dev artifacts, documents)
3. Present findings sorted by size
4. Offer cleanup options via AskUserQuestion

Phase 1 - Disk Overview

第一阶段 - 磁盘概况

Get the lay of the land before diving into specifics.
bash
/usr/bin/env bash << 'OVERVIEW_EOF'
echo "=== Disk Overview ==="
df -h /

echo ""
echo "=== Major Directories ==="
du -sh ~/Library/Caches ~/Library/Logs ~/Library/Application\ Support \
  ~/.Trash ~/Downloads ~/Documents ~/Desktop ~/Movies ~/Music ~/Pictures \
  2>/dev/null | sort -rh

echo ""
echo "=== Developer Tool Caches ==="
du -sh ~/.docker ~/.npm ~/.cargo ~/.rustup ~/.local ~/.cache \
  ~/.conda ~/.pyenv ~/.local/share/mise 2>/dev/null | sort -rh
OVERVIEW_EOF
在深入细节之前先了解整体情况。
bash
/usr/bin/env bash << 'OVERVIEW_EOF'
echo "=== Disk Overview ==="
df -h /

echo ""
echo "=== Major Directories ==="
du -sh ~/Library/Caches ~/Library/Logs ~/Library/Application\ Support \
  ~/.Trash ~/Downloads ~/Documents ~/Desktop ~/Movies ~/Music ~/Pictures \
  2>/dev/null | sort -rh

echo ""
echo "=== Developer Tool Caches ==="
du -sh ~/.docker ~/.npm ~/.cargo ~/.rustup ~/.local ~/.cache \
  ~/.conda ~/.pyenv ~/.local/share/mise 2>/dev/null | sort -rh
OVERVIEW_EOF

Phase 2 - Cache Audit & Cleanup

第二阶段 - 缓存审计与清理

Cache Size Reference

缓存大小参考

CacheLocationTypical SizeClean Command
uv
~/Library/Caches/uv/
5-15 GB
uv cache clean
Homebrew
~/Library/Caches/Homebrew/
3-10 GB
brew cleanup --prune=all
pip
~/Library/Caches/pip/
0.5-2 GB
pip cache purge
npm
~/.npm/_cacache/
0.5-2 GB
npm cache clean --force
cargo
~/.cargo/registry/cache/
1-5 GB
cargo cache -a
(needs cargo-cache)
rustup
~/.rustup/toolchains/
2-8 GB
rustup toolchain remove <old>
DockerDocker.app5-30 GB
docker system prune -a
Playwright
~/Library/Caches/ms-playwright/
0.5-2 GB
npx playwright uninstall
sccache
~/Library/Caches/Mozilla.sccache/
1-3 GB
rm -rf ~/Library/Caches/Mozilla.sccache
huggingface
~/.cache/huggingface/
1-10 GB
rm -rf ~/.cache/huggingface/hub/<model>
缓存名称位置典型大小清理命令
uv
~/Library/Caches/uv/
5-15 GB
uv cache clean
Homebrew
~/Library/Caches/Homebrew/
3-10 GB
brew cleanup --prune=all
pip
~/Library/Caches/pip/
0.5-2 GB
pip cache purge
npm
~/.npm/_cacache/
0.5-2 GB
npm cache clean --force
cargo
~/.cargo/registry/cache/
1-5 GB
cargo cache -a
(needs cargo-cache)
rustup
~/.rustup/toolchains/
2-8 GB
rustup toolchain remove <old>
DockerDocker.app5-30 GB
docker system prune -a
Playwright
~/Library/Caches/ms-playwright/
0.5-2 GB
npx playwright uninstall
sccache
~/Library/Caches/Mozilla.sccache/
1-3 GB
rm -rf ~/Library/Caches/Mozilla.sccache
huggingface
~/.cache/huggingface/
1-10 GB
rm -rf ~/.cache/huggingface/hub/<model>

Safe Cleanup Commands (Always Re-downloadable)

安全清理命令(可重新下载,无风险)

bash
/usr/bin/env bash << 'CACHE_CLEAN_EOF'
set -euo pipefail

echo "=== Measuring current cache sizes ==="
echo "uv:       $(du -sh ~/Library/Caches/uv/ 2>/dev/null | cut -f1 || echo 'N/A')"
echo "Homebrew: $(du -sh ~/Library/Caches/Homebrew/ 2>/dev/null | cut -f1 || echo 'N/A')"
echo "pip:      $(du -sh ~/Library/Caches/pip/ 2>/dev/null | cut -f1 || echo 'N/A')"
echo "npm:      $(du -sh ~/.npm/_cacache/ 2>/dev/null | cut -f1 || echo 'N/A')"

echo ""
echo "=== Cleaning ==="
brew cleanup --prune=all 2>&1 | tail -3
uv cache clean --force 2>&1
pip cache purge 2>&1
npm cache clean --force 2>&1
CACHE_CLEAN_EOF
bash
/usr/bin/env bash << 'CACHE_CLEAN_EOF'
set -euo pipefail

echo "=== Measuring current cache sizes ==="
echo "uv:       $(du -sh ~/Library/Caches/uv/ 2>/dev/null | cut -f1 || echo 'N/A')"
echo "Homebrew: $(du -sh ~/Library/Caches/Homebrew/ 2>/dev/null | cut -f1 || echo 'N/A')"
echo "pip:      $(du -sh ~/Library/Caches/pip/ 2>/dev/null | cut -f1 || echo 'N/A')"
echo "npm:      $(du -sh ~/.npm/_cacache/ 2>/dev/null | cut -f1 || echo 'N/A')"

echo ""
echo "=== Cleaning ==="
brew cleanup --prune=all 2>&1 | tail -3
uv cache clean --force 2>&1
pip cache purge 2>&1
npm cache clean --force 2>&1
CACHE_CLEAN_EOF

Troubleshooting Cache Cleanup

缓存清理故障排除

IssueCauseSolution
uv cache
lock held
Another uv process runningUse
uv cache clean --force
brew cleanup
skips formulae
Linked but not latestSafe to ignore, or
brew reinstall <pkg>
pip cache purge
permission denied
System pip vs user pipUse
python -m pip cache purge
Docker not runningDocker Desktop not startedStart Docker.app first, or skip
问题原因解决方案
uv cache
被锁定
有其他uv进程在运行使用
uv cache clean --force
brew cleanup
跳过部分包
已链接但不是最新版本可忽略,或执行
brew reinstall <pkg>
pip cache purge
权限被拒绝
系统pip与用户pip冲突使用
python -m pip cache purge
Docker未运行Docker Desktop未启动先启动Docker.app,或跳过此步骤

Phase 3 - Forgotten File Detection

第三阶段 - 过期文件检测

Find large files that have not been accessed in 180+ days.
bash
/usr/bin/env bash << 'STALE_EOF'
echo "=== Large forgotten files (>50MB, untouched 180+ days) ==="
echo ""
查找180天以上未访问的大文件。
bash
/usr/bin/env bash << 'STALE_EOF'
echo "=== Large forgotten files (>50MB, untouched 180+ days) ==="
echo ""

Scan home directory (excluding Library, node_modules, .git, hidden dirs)

Scan home directory (excluding Library, node_modules, .git, hidden dirs)

find "$HOME" -maxdepth 4
-not -path '/.'
-not -path '/Library/'
-not -path '/node_modules/'
-not -path '/.git/'
-type f -atime +180 -size +50M 2>/dev/null |
while read -r f; do mod_date=$(stat -f '%Sm' -t '%Y-%m-%d' "$f" 2>/dev/null) size=$(du -sh "$f" 2>/dev/null | cut -f1) echo "${mod_date} ${size} ${f}" done | sort
echo "" echo "=== Documents & Desktop (>10MB, untouched 180+ days) ===" find "$HOME/Documents" "$HOME/Desktop"
-type f -atime +180 -size +10M 2>/dev/null |
while read -r f; do mod_date=$(stat -f '%Sm' -t '%Y-%m-%d' "$f" 2>/dev/null) size=$(du -sh "$f" 2>/dev/null | cut -f1) echo "${mod_date} ${size} ${f}" done | sort STALE_EOF
undefined
find "$HOME" -maxdepth 4
-not -path '/.'
-not -path '/Library/'
-not -path '/node_modules/'
-not -path '/.git/'
-type f -atime +180 -size +50M 2>/dev/null |
while read -r f; do mod_date=$(stat -f '%Sm' -t '%Y-%m-%d' "$f" 2>/dev/null) size=$(du -sh "$f" 2>/dev/null | cut -f1) echo "${mod_date} ${size} ${f}" done | sort
echo "" echo "=== Documents & Desktop (>10MB, untouched 180+ days) ===" find "$HOME/Documents" "$HOME/Desktop"
-type f -atime +180 -size +10M 2>/dev/null |
while read -r f; do mod_date=$(stat -f '%Sm' -t '%Y-%m-%d' "$f" 2>/dev/null) size=$(du -sh "$f" 2>/dev/null | cut -f1) echo "${mod_date} ${size} ${f}" done | sort STALE_EOF
undefined

Common Forgotten File Types

常见被遗忘的文件类型

TypeTypical LocationExample
Windows/Linux ISOsDocuments, Downloads
.iso
files from VM setup
CapCut/iMovie exportsMovies/Large
.mp4
renders
Phone video transfersPictures/, DCIM/
.MOV
files from iPhone
Old Zoom recordingsDocuments/
.aac
,
.mp4
from meetings
Orphaned downloadsDocuments/
CFNetworkDownload_*.mp4
Screen recordingsDocuments/, Desktop/Capto/QuickTime
.mov
文件类型典型位置示例
Windows/Linux镜像文件文档、下载文件夹虚拟机设置的
.iso
文件
CapCut/iMovie导出文件电影文件夹/大型
.mp4
渲染文件
手机视频传输文件图片文件夹/, DCIM/iPhone的
.MOV
文件
旧Zoom录制文件文档文件夹/会议的
.aac
,
.mp4
文件
孤立下载文件文档文件夹/
CFNetworkDownload_*.mp4
文件
屏幕录制文件文档文件夹/, 桌面/Capto/QuickTime的
.mov
文件

Phase 4 - Downloads Triage

第四阶段 - 下载文件夹整理

Use AskUserQuestion with multi-select to let the user choose what to clean.
使用AskUserQuestion的多选功能让用户选择要清理的内容。

Workflow

工作流程

  1. List all files in
    ~/Downloads
    with dates and sizes
  2. Categorize into logical groups
  3. Present AskUserQuestion with categories as multi-select options
  4. Offer personal/sensitive PDFs separately (keep, move to Documents, or delete)
  5. Execute selected actions
  1. 列出
    ~/Downloads
    中的所有文件及其日期和大小
  2. 将文件分类为逻辑组
  3. 以分类为多选选项呈现AskUserQuestion
  4. 单独处理个人/敏感PDF文件(保留、移动到文档文件夹或删除)
  5. 执行用户选择的操作

Categorization Pattern

分类脚本

bash
/usr/bin/env bash << 'DL_LIST_EOF'
echo "=== Downloads by date and size ==="
find "$HOME/Downloads" -maxdepth 1 \( -type f -o -type d \) ! -path "$HOME/Downloads" | \
while read -r f; do
  mod_date=$(stat -f '%Sm' -t '%Y-%m-%d' "$f" 2>/dev/null)
  size=$(du -sh "$f" 2>/dev/null | cut -f1)
  echo "${mod_date} ${size} $(basename "$f")"
done | sort
DL_LIST_EOF
bash
/usr/bin/env bash << 'DL_LIST_EOF'
echo "=== Downloads by date and size ==="
find "$HOME/Downloads" -maxdepth 1 \( -type f -o -type d \) ! -path "$HOME/Downloads" | \
while read -r f; do
  mod_date=$(stat -f '%Sm' -t '%Y-%m-%d' "$f" 2>/dev/null)
  size=$(du -sh "$f" 2>/dev/null | cut -f1)
  echo "${mod_date} ${size} $(basename "$f")"
done | sort
DL_LIST_EOF

AskUserQuestion Template

AskUserQuestion模板

When presenting Downloads cleanup options, use this pattern:
  • Question 1 (multiSelect: true) - "Which items in ~/Downloads do you want to delete?"
    • Group by type: movie files (with total size), old PDFs/docs, dev artifacts, app exports
  • Question 2 (multiSelect: false) - "What about personal/sensitive PDFs?"
    • Options: Keep all, Move to Documents, Delete (already have copies)
  • Question 3 (multiSelect: false) - "Ongoing cleanup tool preference?"
    • Options: dust + dua-cli, Hazel automation, custom launchd script
呈现下载文件夹清理选项时,使用以下模式:
  • 问题1(multiSelect: true)- "你想要删除~/Downloads中的哪些项目?"
    • 按类型分组:视频文件(显示总大小)、旧PDF/文档、开发者产物、应用导出文件
  • 问题2(multiSelect: false)- "个人/敏感PDF文件如何处理?"
    • 选项:全部保留、移动到文档文件夹、删除(已备份)
  • 问题3(multiSelect: false)- "长期清理工具偏好?"
    • 选项:dust + dua-cli、Hazel自动化、自定义launchd脚本

Disk Analysis Tools Reference

磁盘分析工具参考

Comparison (Benchmarked on ~632GB home directory, Apple Silicon)

对比测试(基于约632GB的用户目录,Apple Silicon芯片)

ToolWall TimeCPU UsageInteractive DeleteInstall
dust20.4s637% (parallel)No (view only)
brew install dust
gdu-go28.8s845% (very parallel)Yes (TUI)
brew install gdu
dua-cli37.1s237% (moderate)Yes (staged safe delete)
brew install dua-cli
ncdu96.6s43% (single-thread)Yes (TUI)
brew install ncdu
工具耗时CPU占用交互式删除安装方式
dust20.4秒637%(并行)不支持(仅查看)
brew install dust
gdu-go28.8秒845%(高度并行)支持(TUI)
brew install gdu
dua-cli37.1秒237%(中等并行)支持(安全分步删除)
brew install dua-cli
ncdu96.6秒43%(单线程)支持(TUI)
brew install ncdu

Recommended Combo

推荐组合

  • dust
    for quick "where is my space going?" - fastest scanner, tree output
  • dua i
    or
    gdu-go
    for interactive exploration with deletion
  • dust
    用于快速查看"空间都去哪了?" - 最快的扫描工具,树形输出
  • dua i
    gdu-go
    用于带删除功能的交互式探索

Quick Usage

快速使用指南

bash
undefined
bash
undefined

dust - instant tree overview

dust - 即时树形概览

dust -d 2 ~ # depth 2 dust -r ~/Library # reverse sort (smallest first)
dust -d 2 ~ # 深度为2 dust -r ~/Library # 反向排序(从小到大)

dua - interactive TUI with safe deletion

dua - 带安全删除的交互式TUI

dua i ~ # navigate, mark, delete with confirmation
dua i ~ # 导航、标记、确认后删除

gdu-go - ncdu-like TUI, fast on SSDs

gdu-go - 类似ncdu的TUI,在SSD上速度快

gdu-go ~ # full TUI with delete support gdu-go -n ~ # non-interactive (for scripting/benchmarks)
undefined
gdu-go ~ # 完整TUI,支持删除 gdu-go -n ~ # 非交互式(用于脚本/基准测试)
undefined

Install All Tools

安装所有工具

bash
brew install dust dua-cli gdu
Note: gdu installs as
gdu-go
to avoid conflict with coreutils.
bash
brew install dust dua-cli gdu
注意:gdu安装后命令为
gdu-go
,避免与coreutils冲突。

Quick Wins Summary

快速清理效果汇总

Ordered by typical space reclaimed (highest first):
ActionTypical SavingsRiskCommand
uv cache clean
5-15 GBNone (re-downloads)
uv cache clean --force
brew cleanup --prune=all
3-10 GBNone (re-downloads)
brew cleanup --prune=all
Delete movie files in Downloads2-10 GBCheck firstManual after AskUserQuestion
npm cache clean --force
0.5-2 GBNone (re-downloads)
npm cache clean --force
pip cache purge
0.5-2 GBNone (re-downloads)
pip cache purge
Prune old rustup toolchains2-5 GBKeep current
rustup toolchain list
then remove
Docker system prune5-30 GBRemoves stopped containers
docker system prune -a
Empty TrashVariableIrreversible
rm -rf ~/.Trash/*
按典型回收空间从高到低排序:
操作典型回收空间风险命令
uv cache clean
5-15 GB无(可重新下载)
uv cache clean --force
brew cleanup --prune=all
3-10 GB无(可重新下载)
brew cleanup --prune=all
删除下载文件夹中的视频文件2-10 GB需先确认通过AskUserQuestion手动操作
npm cache clean --force
0.5-2 GB无(可重新下载)
npm cache clean --force
pip cache purge
0.5-2 GB无(可重新下载)
pip cache purge
清理旧rustup工具链2-5 GB保留当前版本
rustup toolchain list
然后删除
Docker系统清理5-30 GB会移除已停止的容器
docker system prune -a
清空废纸篓空间可变不可逆
rm -rf ~/.Trash/*

Post-Change Checklist

修改后检查清单

After modifying this skill:
  1. Cache commands tested on macOS (Apple Silicon)
  2. Benchmark data still current (re-run if tools updated)
  3. AskUserQuestion patterns match current tool API
  4. All bash blocks use
    /usr/bin/env bash << 'EOF'
    wrapper
  5. No hardcoded user paths (use
    $HOME
    )
  6. Append changes to evolution-log.md
修改此技能后需完成:
  1. 缓存命令已在macOS(Apple Silicon)上测试
  2. 基准数据仍有效(若工具更新需重新运行测试)
  3. AskUserQuestion模式符合当前工具API
  4. 所有bash块使用
    /usr/bin/env bash << 'EOF'
    包裹
  5. 无硬编码用户路径(使用
    $HOME
  6. 将修改记录添加到evolution-log.md

Troubleshooting

故障排除

IssueCauseSolution
uv cache clean
hangs
Lock held by running uvUse
--force
flag
brew cleanup
frees 0 bytes
Already clean or formulae linkedRun
brew cleanup --prune=all
find
reports permission denied
System Integrity ProtectionAdd
2>/dev/null
to suppress
gdu
command not found
Installed as
gdu-go
Use
gdu-go
(coreutils conflict)
dust
shows different size than
df
Counting method differsNormal -
df
includes filesystem overhead
Stale file scan is slowDeep directory treeLimit
-maxdepth
or exclude more paths
Docker not accessibleDesktop app not runningStart Docker.app or skip Docker cleanup
问题原因解决方案
uv cache clean
卡住
有运行中的uv进程锁定使用
--force
参数
brew cleanup
未释放空间
已清理干净或包已链接运行
brew cleanup --prune=all
find
报告权限不足
系统完整性保护限制添加
2>/dev/null
抑制错误信息
gdu
命令未找到
安装后命令为
gdu-go
使用
gdu-go
(与coreutils冲突)
dust
显示大小与
df
不同
计数方式不同正常现象 -
df
包含文件系统开销
过期文件扫描缓慢目录树过深限制
-maxdepth
或排除更多路径
Docker无法访问桌面应用未运行启动Docker.app或跳过Docker清理步骤