English · Tiếng Việt
Tài liệu tổng hợp lệnh terminal để tìm ra chỗ đang ngốn dung lượng rồi giải phóng nó: rác của các công cụ AI (transcript, cache IDE, model weights), cache hệ thống, cache của package manager, môi trường dev (Node/Python/Rust/Go/Java/Docker) và các thư mục rác đặc thù của từng OS.
Phần AI được đặt đầu tiên (§A) vì đó là nhóm phình nhanh nhất hiện nay và không công cụ dọn dẹp nào của OS đụng tới nó.
Quy tắc vàng: đo trước, xóa sau. Chạy phần §0 Chẩn đoán trước để biết GB đang nằm ở đâu — xóa mù thường chỉ thu lại vài trăm MB trong khi thủ phạm thật là một thư mục
node_modules/DerivedData/ Docker volume nặng 40 GB.
Chú thích mức độ an toàn dùng xuyên suốt tài liệu:
| Nhãn | Ý nghĩa |
|---|---|
| 🟢 An toàn | Chỉ xóa cache tái tạo được. Chạy thoải mái. |
| 🟡 Cân nhắc | Mất cache khiến lần build/cài kế tiếp chậm, hoặc phải đăng nhập lại. |
| 🔴 Cẩn thận | Có thể mất dữ liệu thật / cần đóng app trước / không hoàn tác được. |
Quy ước: mọi lệnh có thao tác xóa đều mang nhãn — hoặc ở đầu gạch đầu dòng,
hoặc dưới dạng comment ngay cuối dòng trong code block. Lệnh không có nhãn xóa
là lệnh chỉ đọc (du, df, find … -print, ls, *list) — chạy được vô tư.
Khi một lệnh vừa đo vừa xóa, nhãn luôn theo vế xóa.
macOS mặc định dùng zsh. Khi một mẫu * không khớp file nào, zsh báo lỗi
và hủy luôn cả lệnh, trong khi bash chỉ giữ nguyên chuỗi rồi chạy tiếp:
zsh: no matches found: /Users/thang/.aider*
Nghĩa là chỉ cần một đường dẫn không tồn tại là cả vòng lặp không chạy dòng nào —
kể cả khi bạn đã có 2>/dev/null, vì lỗi xảy ra lúc zsh khai triển glob, trước
khi lệnh được gọi, nên redirect không đỡ được.
Các lệnh xóa trong tài liệu này đã được viết lại cho không còn glob (dùng
find … -exec thay cho rm -rf thư-mục/*) để chạy đúng trên cả hai shell. Một số
lệnh liệt kê vẫn cần * (ví dụ du -sh ~/.claude/*). Nếu gặp no matches found:
setopt +o nomatch # 🟢 chỉ đổi hành vi shell, tự mất khi đóng terminalMuốn tắt vĩnh viễn thì thêm unsetopt nomatch vào ~/.zshrc. Xem shell đang dùng:
echo $SHELL.
Các khác biệt macOS (BSD) ↔ Ubuntu (GNU) khác đã được xử lý sẵn trong tài liệu:
du không có --max-depth (dùng -d), find không có -printf, find không có
-mindepth… vẫn có. Riêng sort -rh thì cả hai đều hỗ trợ, dùng bình thường.
🟢 Toàn bộ §0 là chỉ đọc — không lệnh nào trong phần này xóa bất cứ thứ gì. Ngoại lệ duy nhất: trong
ncdubạn có thể bấm phímdđể xóa — đó là thao tác tay của bạn, và nó là 🔴 (xóa ngay, không qua thùng rác).
df -h # dung lượng còn trống theo từng phân vùng
df -h / # chỉ ổ hệ thống# Top 20 thư mục nặng nhất trong thư mục hiện tại
du -sh -- * .[!.]* 2>/dev/null | sort -rh | head -20
# Quét cả home directory
du -sh ~/* ~/.[!.]* 2>/dev/null | sort -rh | head -25Ubuntu — quét toàn hệ thống (-x = không đi sang phân vùng khác):
sudo du -xh / --max-depth=1 2>/dev/null | sort -rh | head -20macOS — du bản BSD không có --max-depth, dùng -d:
sudo du -xh -d 1 / 2>/dev/null | sort -rh | head -20
sudo du -xh -d 1 ~/Library 2>/dev/null | sort -rh | head -20# Ubuntu
sudo apt install ncdu
ncdu -x / # duyệt cây thư mục, bấm 'd' để xóa
# macOS
brew install ncdu
ncdu -x / # hoặc: brew install dust && dust -d 2 ~Bản GUI: Ubuntu có Disk Usage Analyzer (baobab), macOS có
Apple → About This Mac → Storage → Manage hoặc app GrandPerspective.
# File > 500 MB trong home
find ~ -type f -size +500M -exec ls -lh {} \; 2>/dev/null | awk '{print $5, $9}'
# 20 file lớn nhất toàn máy (Ubuntu)
sudo find / -xdev -type f -printf '%s %p\n' 2>/dev/null | sort -rn | head -20
# macOS (find BSD không có -printf)
sudo find / -xdev -type f -size +500M 2>/dev/null -exec ls -lh {} + | awk '{print $5, $9}'Đây là nhóm rác mới nhất và phình nhanh nhất trên máy dev, nhưng gần như không có công cụ dọn dẹp nào của hệ điều hành đụng tới: transcript hội thoại, cache webview của IDE, extension VSIX đã tải, và model weights hàng chục GB.
Lệnh đo 1 phát — chạy cái này trước:
# 🟢 chỉ đọc. Không dùng glob nào → chạy đúng trên cả bash lẫn zsh (macOS).
for p in ~/.claude ~/.codex ~/.gemini ~/.cursor ~/.windsurf ~/.continue \
~/.aider.tags.cache.v3 ~/.aider.chat.history.md \
~/.ollama ~/.lmstudio ~/.copilot ~/.anthropic \
~/.cache/huggingface ~/.cache/torch ~/.cache/whisper ~/.cache/lm-studio \
~/.keras ~/.triton ~/.nv ~/.cache/claude-cli-nodejs \
~/.vscode/extensions ~/.cursor/extensions \
~/.config/Code ~/.config/Cursor ~/.config/Windsurf \
~/Library/Application\ Support/Code \
~/Library/Application\ Support/Cursor \
~/Library/Application\ Support/Windsurf \
~/Library/Caches/JetBrains; do
[ -e "$p" ] && du -sh "$p" 2>/dev/null
done | sort -rhSố liệu thật đo trên một máy dev Ubuntu đang dùng nhiều công cụ AI (để bạn hình dung độ lớn):
~/.config/Code5.0 G,~/.vscode/extensions1.6 G,~/.cursor638 M,~/.claude369 M,~/.codex150 M,~/.gemini104 M — tổng hơn 7 GB màapt cleankhông chạm được dòng nào.
Rác chính là transcript hội thoại (JSONL/SQLite) tích lũy theo từng project.
Claude Code — xem cái gì đang nặng:
du -sh ~/.claude/* 2>/dev/null | sort -rh | headThường thấy: projects/ (transcript, nặng nhất), plugins/, file-history/,
shell-snapshots/, todos/, statsig/, backups/.
- 🟡 Xóa transcript cũ hơn 30 ngày — đánh đổi: không
--resume/--continuelại được các session đó nữa:du -sh ~/.claude/projects/* 2>/dev/null | sort -rh | head # xem trước find ~/.claude/projects -name '*.jsonl' -mtime +30 -print # kiểm tra danh sách # đồng ý rồi mới đổi -print thành -delete
- 🟢 Rác chắc chắn tái tạo được:
# không glob → chạy được trên zsh; các thư mục này tự tạo lại ở lần chạy sau rm -rf ~/.claude/shell-snapshots ~/.claude/statsig ~/.cache/claude-cli-nodejs find /tmp -maxdepth 1 -name 'claude-*' -exec rm -rf {} + 2>/dev/null
- 🟡 Lịch sử sửa file & backup (dùng để undo các thay đổi cũ):
du -sh ~/.claude/file-history ~/.claude/backups find ~/.claude/file-history -mtime +30 -delete
- 🔴 Đừng xóa:
~/.claude/settings.json,~/.claude.json,~/.claude/CLAUDE.md,~/.claude/skills,~/.claude/agents,~/.claude/memory— là cấu hình và bộ nhớ bạn tự viết, không tái tạo được.
Codex CLI:
du -sh ~/.codex/* 2>/dev/null | sort -rh
rm -rf ~/.codex/cache # 🟢
find ~/.codex/sessions -mtime +30 -delete # 🟡 mất lịch sử session
ls -lh ~/.codex/logs*.sqlite # 🟡 file log có thể vài chục MBGemini CLI / Antigravity:
du -sh ~/.gemini/* 2>/dev/null | sort -rh
rm -rf ~/.gemini/tmp ~/.gemini/cache 2>/dev/null # 🟢Aider — rác nằm trong từng repo, không phải ở home:
# 🟢 chỉ đọc — tìm cache và lịch sử chat của Aider nằm rải trong các repo
find ~ -name '.aider.tags.cache.v*' -type d -prune 2>/dev/null \
| xargs -I{} du -sh {} 2>/dev/null | sort -rh | head
find ~ \( -name '.aider.chat.history.md' -o -name '.aider.input.history' \) 2>/dev/null
# 🟢 cache tags — Aider tự dựng lại ở lần chạy sau
find ~ -name '.aider.tags.cache.v*' -type d -prune -exec rm -rf {} + 2>/dev/null
# 🔴 lịch sử chat là dữ liệu bạn tạo ra — xem trước rồi mới xóa từng fileNguyên tắc chung cho nhóm này: transcript là dữ liệu bạn tạo ra. Nếu có đoạn hội thoại quan trọng, export/copy ra trước khi xóa hàng loạt.
Đây thường là thư mục nặng nhất trong home của một máy dev — chủ yếu do webview storage của các panel chat AI và extension đã tải về.
Đường dẫn theo OS:
| Thành phần | Ubuntu | macOS |
|---|---|---|
| VS Code | ~/.config/Code |
~/Library/Application Support/Code |
| Cursor | ~/.config/Cursor |
~/Library/Application Support/Cursor |
| Windsurf | ~/.config/Windsurf |
~/Library/Application Support/Windsurf |
| Extensions | ~/.vscode/extensions, ~/.cursor/extensions |
giống Ubuntu (nằm ở ~) |
Đóng IDE trước khi chạy các lệnh dưới đây.
BASE=~/.config/Code # macOS: BASE=~/Library/Application\ Support/Code
du -sh "$BASE"/* 2>/dev/null | sort -rh | head -8- 🟢 Cache thuần — xóa thoải mái:
rm -rf "$BASE"/Cache "$BASE"/CachedData "$BASE"/CachedExtensionVSIXs \ "$BASE"/Code\ Cache "$BASE"/GPUCache "$BASE"/logs
CachedExtensionVSIXslà các file.vsixđã tải để cài extension — cài xong là vô dụng (trên máy đo được: 654 MB). - 🟡
WebStorage— thủ phạm lớn nhất, chính là storage của các webview AI chat (đo được 3.1 GB). Xóa sẽ mất state hiển thị của một số panel, không mất code:du -sh "$BASE"/WebStorage rm -rf "$BASE"/WebStorage
- 🟡
User/globalStorage— dữ liệu extension, trong đó có lịch sử Copilot Chat:du -sh "$BASE"/User/globalStorage/* 2>/dev/null | sort -rh | head rm -rf "$BASE"/User/globalStorage/github.copilot-chat # mất lịch sử chat Copilot
- 🟡
User/workspaceStorage— state riêng cho từng thư mục đã từng mở (đo được 241 MB). Rất nhiều mục trỏ tới project đã xóa từ lâu:du -sh "$BASE"/User/workspaceStorage | tail -1 find "$BASE"/User/workspaceStorage -maxdepth 1 -mtime +180 -print # kiểm tra trước
- 🟡 Extensions — gỡ cái không dùng thay vì xóa cả thư mục:
Xóa trắng
du -sh ~/.vscode/extensions/* 2>/dev/null | sort -rh | head -15 code --list-extensions code --uninstall-extension <publisher.name>
~/.vscode/extensionscũng được (🟡) — VS Code sẽ cài lại nếu bạn bật Settings Sync, nhưng phải tải lại toàn bộ. - 🔴 Đừng xóa:
User/settings.json,User/keybindings.json,User/snippets,User/History(là bản local history của file bạn sửa — có thể cứu code).
Cursor/Windsurf có thêm thư mục riêng ở home:
du -sh ~/.cursor/* 2>/dev/null | sort -rh # extensions, projects, ai-tracking…
rm -rf ~/.cursor/ai-tracking 2>/dev/null # 🟢 telemetry cục bộNhóm này không tính bằng MB mà bằng chục GB. Nếu bạn có cài, đây gần như chắc chắn là thứ nặng nhất trong toàn bộ tài liệu này.
Ollama:
ollama list # xem model + dung lượng
du -sh ~/.ollama/models 2>/dev/null # macOS: ~/.ollama/models cũng vậy
ollama rm llama3:70b # 🔴 xóa hẳn, muốn dùng lại phải pull ~40GB
ollama ps # model nào đang nạp trong RAMNếu chạy Ollama bằng Docker, model nằm trong volume: docker volume ls | grep ollama
rồi docker volume rm <tên> (🔴).
LM Studio:
du -sh ~/.lmstudio/models ~/.cache/lm-studio 2>/dev/null
# macOS: ~/.lmstudio, ~/Library/Application Support/LM StudioFile GGUF/safetensors rải rác (tải tay, để quên trong Downloads):
find ~ -type f \( -name '*.gguf' -o -name '*.safetensors' -o -name '*.ckpt' -o -name '*.pt' \) \
-size +200M 2>/dev/null -exec ls -lh {} + | awk '{print $5, $9}' | sort -rhModel tải tự động khi chạy code — dễ quên vì không ai chủ động tải chúng.
du -sh ~/.cache/huggingface ~/.cache/torch ~/.cache/whisper \
~/.keras ~/.cache/clip ~/.triton ~/.nv 2>/dev/null | sort -rh- 🟡 HuggingFace — có công cụ xóa chọn lọc, tốt hơn
rm -rf:(Đặthuggingface-cli scan-cache # bảng model + dung lượng + lần dùng cuối huggingface-cli delete-cache # chọn revision để xóa (giao diện tương tác) # hoặc thẳng tay: rm -rf ~/.cache/huggingface/hub
HF_HOME=/ổ/khác/hftrong~/.bashrc/~/.zshrcđể chuyển hẳn cache sang ổ rộng hơn thay vì phải dọn định kỳ.) - 🟢 PyTorch / Keras / Whisper / CLIP:
rm -rf ~/.cache/torch/hub ~/.cache/torch/checkpoints rm -rf ~/.cache/whisper ~/.cache/clip du -sh ~/.keras/models 2>/dev/null
- 🟢 Cache JIT của GPU (tự sinh lại, chỉ chậm lần chạy đầu):
rm -rf ~/.nv/ComputeCache ~/.triton/cache
- 🟡 Virtualenv chứa
torch/mediapipe/onnxruntime— mỗi cái 2–6 GB, và thường có nhiều bản trùng nhau ở các project khác nhau:Xóa được vìfind ~ -maxdepth 5 -type d \( -name '.venv' -o -name 'venv' \) -prune 2>/dev/null \ | xargs -I{} du -sh {} 2>/dev/null | sort -rh | head -10
pip install -r requirements.txtdựng lại được — nhưng kiểm tra project đó có còn dùng không trước khi xóa. Xem thêm §D2.
Output của Stable Diffusion, ComfyUI, Automatic1111… là dữ liệu thật (🔴) — chỉ dọn phần model và cache, và tự rà thư mục output:
du -sh ~/stable-diffusion-webui/models ~/ComfyUI/models 2>/dev/null
du -sh ~/stable-diffusion-webui/outputs ~/ComfyUI/output 2>/dev/nullĐóng IDE trước khi chạy:
# 🟢 TOÀN BỘ block này chỉ xóa cache tái tạo được: không đụng transcript
# (~/.claude/projects, ~/.codex/sessions), không đụng settings, không đụng model.
CODE=~/.config/Code # macOS: CODE=~/Library/Application\ Support/Code
rm -rf "$CODE"/Cache "$CODE"/CachedData "$CODE"/CachedExtensionVSIXs "$CODE"/GPUCache "$CODE"/logs \
&& rm -rf ~/.claude/shell-snapshots ~/.claude/statsig ~/.cache/claude-cli-nodejs \
&& rm -rf ~/.codex/cache ~/.gemini/tmp ~/.cursor/ai-tracking \
&& find /tmp -maxdepth 1 -name 'claude-*' -exec rm -rf {} + 2>/dev/null \
&& rm -rf ~/.nv/ComputeCache ~/.triton/cache ~/.cache/torch/hub \
&& df -h /- 🟢 Xóa các gói phụ thuộc không còn dùng (kể cả kernel cũ):
sudo apt autoremove -y
- 🔴 Xóa luôn cả file cấu hình của các gói đó (mạnh tay hơn, dọn kernel cũ triệt để):
sudo apt autoremove --purge -y
- 🟢 Xóa toàn bộ cache gói
.debđã tải:sudo apt clean
- 🟢 Chỉ xóa các gói
.debđã cũ/hết hạn (nhẹ tay hơnclean):sudo apt autoclean
- 🟢 Dọn nhật ký hệ thống — giữ 3 ngày, hoặc giới hạn theo dung lượng:
journalctl --disk-usage # xem log đang chiếm bao nhiêu sudo journalctl --vacuum-time=3d sudo journalctl --vacuum-size=200M - 🟢 Log xoay vòng cũ trong
/var/log:sudo find /var/log -type f -regex '.*\.\(gz\|old\|[0-9]+\)$' -delete - 🟢 Dọn thùng rác:
find ~/.local/share/Trash -mindepth 1 -delete 2>/dev/null # không glob, an toàn trên zsh
- 🟢 Báo cáo crash cũ (
/var/crash) — thường vài GB:sudo rm -rf /var/crash/* - 🟡 Kiểm tra kernel đang dùng trước khi gỡ kernel cũ:
uname -r # kernel đang chạy — TUYỆT ĐỐI không gỡ dpkg -l 'linux-image-*' | grep '^ii' # danh sách kernel đã cài
- 🟢 Xóa các bản Snap cũ (thường giải phóng nhiều GB):
LANG=C snap list --all | awk '/disabled/{print $1, $3}' \ | while read -r snapname revision; do sudo snap remove "$snapname" --revision="$revision" done
- 🟡 Giới hạn snap chỉ giữ 2 bản (chặn rác từ gốc):
sudo snap set system refresh.retain=2 - 🟢 Flatpak — gỡ runtime không còn ai dùng:
flatpak uninstall --unused -y flatpak repair --user
- 🟡 Xóa file cấu hình rác của phần mềm đã gỡ (residual configs
rc):dpkg -l | awk '/^rc/ { print $2 }' | sudo xargs --no-run-if-empty dpkg --purge
- 🔴 Xóa cache người dùng toàn bộ — an toàn về mặt dữ liệu nhưng sẽ đăng xuất
một số app / mất thumbnail / lần mở app sau chậm. Nên đóng hết ứng dụng trước:
rm -rf ~/.cache/* # Nhẹ tay hơn — chỉ thumbnail: rm -rf ~/.cache/thumbnails
🔴 Snapshot là bản sao lưu hệ thống — xóa là mất khả năng khôi phục.
sudo timeshift --list # 🟢 chỉ đọc
sudo timeshift --delete --snapshot '2025-01-01_00-00-00' # 🔴 mất bản khôi phục đó vĩnh viễn# 🟢 toàn bộ block: chỉ gói/cache/log tái tạo được. Thùng rác 🟡 — kiểm tra
# `ls ~/.local/share/Trash/files` trước nếu bạn hay dùng nó làm chỗ để tạm.
sudo apt autoremove -y && sudo apt autoclean && sudo apt clean \
&& sudo journalctl --vacuum-time=3d \
&& find ~/.local/share/Trash -mindepth 1 -delete 2>/dev/null \
&& rm -rf ~/.cache/thumbnails \
&& df -h /macOS không có apt/snap/journalctl. Bảng đối chiếu nhanh:
| Việc cần làm | Ubuntu | macOS |
|---|---|---|
| Package manager hệ thống | apt |
brew |
| Cache gói | sudo apt clean |
brew cleanup -s --prune=all |
| Gỡ dependency thừa | apt autoremove |
brew autoremove |
| Log hệ thống | journalctl --vacuum-* |
sudo rm -rf /private/var/log/*.gz |
| Thùng rác | ~/.local/share/Trash |
~/.Trash |
| Cache người dùng | ~/.cache |
~/Library/Caches |
| Snapshot hệ thống | Timeshift | APFS local snapshots (tmutil) |
- 🟢 Dọn version cũ + cache tải về (thường 5–20 GB):
brew cleanup -s --prune=all rm -rf "$(brew --cache)" - 🟡 Gỡ các formula chỉ còn tồn tại vì là dependency của thứ đã gỡ:
brew autoremove
- Xem cái gì đang nặng để cân nhắc gỡ tay:
brew list --formula brew list --cask du -sh "$(brew --prefix)"/Cellar/* 2>/dev/null | sort -rh | head -20 brew doctor
- 🟢 DerivedData (build cache — hay chiếm 20–80 GB):
du -sh ~/Library/Developer/Xcode/DerivedData rm -rf ~/Library/Developer/Xcode/DerivedData # Xcode tự tạo lại thư mục này
- 🟡 iOS DeviceSupport — symbol của các bản iOS cũ, mỗi bản ~3–6 GB:
du -sh ~/Library/Developer/Xcode/iOS\ DeviceSupport/* rm -rf ~/Library/Developer/Xcode/iOS\ DeviceSupport/* # chỉ giữ bản iOS đang test
- 🟢 Simulator rác (runtime/thiết bị không còn khả dụng):
xcrun simctl delete unavailable xcrun simctl shutdown all && xcrun simctl erase all # 🟡 xóa sạch data trong simulator rm -rf ~/Library/Developer/CoreSimulator/Caches/* du -sh ~/Library/Developer/CoreSimulator/Devices # kiểm tra trước
- 🔴 Archives (file
.xcarchiveđể submit App Store — cần cho việc symbolicate crash):du -sh ~/Library/Developer/Xcode/Archives # Xóa archive cũ hơn 90 ngày (-mindepth 2 để không đụng vào thư mục gốc): find ~/Library/Developer/Xcode/Archives -mindepth 2 -maxdepth 2 -type d -mtime +90 -print # kiểm tra danh sách trên xong mới thay -print bằng: -exec rm -rf {} +
- 🟢 Cache khác của Xcode / SwiftPM:
rm -rf ~/Library/Caches/org.swift.swiftpm rm -rf ~/Library/Developer/Xcode/UserData/IB\ Support rm -rf ~/Library/Developer/Xcode/iOS\ Device\ Logs/*
- 🟡 Cache người dùng — đóng hết app trước khi chạy:
du -sh ~/Library/Caches/* | sort -rh | head -20 # xem trước rm -rf ~/Library/Caches/*
- 🟡 Log người dùng:
rm -rf ~/Library/Logs/*
- 🔴 Cache cấp hệ thống (cần
sudo, một số app có thể phải mở lại):sudo rm -rf /Library/Caches/* sudo rm -rf /private/var/log/*.gz /private/var/log/asl/*.asl
- 🟢 Thùng rác (cả ổ ngoài):
find ~/.Trash -mindepth 1 -delete 2>/dev/null # không glob → chạy được trên zsh sudo find /Volumes -maxdepth 2 -name '.Trashes' -exec rm -rf {} + 2>/dev/null
- 🟢 Giải phóng RAM/disk cache đang giữ (an toàn, chỉ hơi khựng máy vài giây):
sudo purge
Đây là lý do kinh điển khiến Finder báo còn 5 GB trong khi du chỉ thấy dữ liệu ít
hơn nhiều: Time Machine giữ snapshot cục bộ ngay trên ổ.
tmutil listlocalsnapshots / # liệt kê snapshot- 🟡 Ép hệ thống dọn snapshot cho tới khi có 20 GB trống (
4= mức khẩn cấp nhất):sudo tmutil thinlocalsnapshots / 21474836480 4
- 🔴 Xóa hẳn một snapshot cụ thể:
sudo tmutil deletelocalsnapshots 2025-01-01-000000
- 🔴 Backup iPhone/iPad (rất nặng, là dữ liệu thật):
du -sh ~/Library/Application\ Support/MobileSync/Backup/*
- 🟡 File đính kèm Mail đã tải:
du -sh ~/Library/Containers/com.apple.mail/Data/Library/Mail\ Downloads 2>/dev/null
- 🟡 Docker Desktop — file ổ ảo (xem thêm §D6):
du -sh ~/Library/Containers/com.docker.docker/Data/vms 2>/dev/null
- 🟢 Bản cài đặt/DMG cũ trong Downloads:
find ~/Downloads -type f \( -name '*.dmg' -o -name '*.pkg' -o -name '*.zip' \) \ -mtime +30 -exec ls -lh {} + | awk '{print $5, $9}'
- 🟡 iOS/macOS software update đã tải dở:
sudo rm -rf /Library/Updates/*
# 🟢 toàn bộ block: cache brew, DerivedData, simulator rác, thùng rác.
# 🟡 duy nhất ~/.Trash — chắc chắn trong đó không còn gì bạn cần.
brew cleanup -s --prune=all \
&& rm -rf "$(brew --cache)" ~/Library/Developer/Xcode/DerivedData \
&& find ~/.Trash -mindepth 1 -delete 2>/dev/null \
&& xcrun simctl delete unavailable \
&& sudo purge \
&& df -h /Với máy lập trình viên, phần này thường giải phóng nhiều hơn cả phần hệ điều hành. Mọi dòng có thao tác xóa đều được gắn nhãn ngay trong code block.
Quản lý phiên bản Node bằng NVM:
nvm ls # 🟢 chỉ đọc — dòng N/A là chưa cài, không tốn dung lượng
du -sh ~/.nvm/versions/node/* | sort -rh # 🟢 chỉ đọc
nvm uninstall 14.17.0 # 🟡 xóa 1 bản Node; project nào ghim bản đó sẽ gãy
nvm current && cat .nvmrc 2>/dev/null # 🟢 kiểm tra bản đang dùng TRƯỚC khi gỡ(macOS cài qua Homebrew thì dùng brew uninstall node@18 — cũng 🟡; hoặc dùng
fnm/volta, xóa tương tự trong ~/.local/share/fnm / ~/.volta/tools.)
Cache của các package manager:
du -sh ~/.npm ~/.cache/yarn ~/Library/Caches/Yarn ~/.bun/install/cache 2>/dev/null # 🟢 chỉ đọc
pnpm store path && du -sh "$(pnpm store path)" # 🟢 chỉ đọc
npm cache clean --force # 🟢 ~/.npm — cài lại tự tải về
yarn cache clean # 🟢 yarn classic
yarn cache clean --all # 🟢 yarn berry
pnpm store prune # 🟢 chỉ xóa package không project nào tham chiếu
bun pm cache rm # 🟢
rm -rf ~/.npm/_npx # 🟢 cache của npx
⚠️ Chỉ 🟢 khi bạn đang online. Nếu sắp làm việc offline hoặc đang ở mạng chậm, mất cache = khôngnpm installđược nữa → khi đó phải coi là 🟡.
node_modules — thủ phạm số 1.
# 🟢 chỉ đọc — liệt kê mọi node_modules kèm dung lượng, nặng nhất lên đầu
find ~ -name node_modules -type d -prune 2>/dev/null \
| xargs -I{} du -sh {} 2>/dev/null | sort -rh | head -20
# 🟢 chỉ đọc — xem project nào không đụng tới trong 90 ngày
find ~/projects -name node_modules -type d -prune -mtime +90 -print
# 🔴 XÓA THẬT — chỉ chạy sau khi đã đọc kỹ danh sách ở trên.
# Rủi ro: project dùng lockfile cũ / package đã bị gỡ khỏi registry sẽ không
# install lại được y hệt. Không đụng repo đang dở việc.
# find ~/projects -name node_modules -type d -prune -mtime +90 -exec rm -rf {} +npx npkill # 🟡 công cụ tương tác — bạn tự chọn thư mục để xóa, xóa là mất luônElectron / build output:
du -sh ~/.cache/electron ~/.electron ~/.cache/electron-builder 2>/dev/null # 🟢 chỉ đọc
rm -rf ~/.cache/electron ~/.electron ~/.cache/electron-builder # 🟡 build Electron kế tiếp phải tải lại ~200MB/bản
rm -rf ~/Library/Caches/electron ~/Library/Caches/electron-builder # 🟡 macOS, tương tựdu -sh ~/.cache/pip ~/.cache/uv ~/.cache/pypoetry 2>/dev/null # 🟢 chỉ đọc
pip cache purge # 🟢 cache wheel — tải lại được
uv cache clean # 🟢 nếu dùng uv
conda clean --all -y # 🟡 gỡ cả package tarball + index; env vẫn còn nguyên
rm -rf ~/.cache/pypoetry # 🟢 Poetry (Ubuntu)
rm -rf ~/Library/Caches/pypoetry # 🟢 Poetry (macOS)# 🟢 bytecode tự sinh lại khi chạy — an toàn tuyệt đối
find ~ -type d -name __pycache__ -prune -exec rm -rf {} + 2>/dev/null
find ~ -type f -name '*.pyc' -delete 2>/dev/null# 🟢 chỉ đọc — tìm virtualenv nặng (bản có torch/mediapipe thường 2–6 GB, xem §A4)
find ~ -maxdepth 4 -type d \( -name '.venv' -o -name 'venv' \) -prune 2>/dev/null \
| xargs -I{} du -sh {} 2>/dev/null | sort -rh | head
# 🔴 xóa 1 venv cụ thể — dựng lại được bằng requirements.txt/pyproject.toml,
# NHƯNG chỉ khi file đó còn và pin version còn cài được. Kiểm tra trước khi xóa:
# ls <project>/requirements.txt <project>/pyproject.toml && rm -rf <project>/.venvtarget/ là hố đen dung lượng — mỗi project vài GB là bình thường.
du -sh ~/.cargo/registry ~/.cargo/git # 🟢 chỉ đọc
# 🟢 chỉ đọc — tìm mọi thư mục target/
find ~ -type d -name target -prune 2>/dev/null \
| xargs -I{} du -sh {} 2>/dev/null | sort -rh | head -20
cargo clean # 🟡 trong từng project — build kế tiếp là full rebuild (chậm)
rm -rf ~/.cargo/registry/cache ~/.cargo/registry/src # 🟢 tải lại được khi buildcargo install cargo-sweep # 🟢 chỉ cài công cụ
cargo sweep --time 30 --dry-run --recursive ~/projects # 🟢 xem trước sẽ xóa gì
cargo sweep --time 30 --recursive ~/projects # 🟡 xóa artifact >30 ngày trong mọi target/rustup toolchain list # 🟢 chỉ đọc
rustup toolchain uninstall nightly-2023-01-01 # 🟡 project ghim toolchain đó (rust-toolchain.toml) sẽ phải tải lạidu -sh "$(go env GOMODCACHE)" "$(go env GOCACHE)" # 🟢 chỉ đọc
go clean -cache # 🟢 build cache — build sau chậm hơn, không mất gì
go clean -testcache # 🟢 kết quả test cache
go clean -modcache # 🟡 module cache — phải tải lại toàn bộ dependency, hỏng nếu offlinedu -sh ~/.gradle ~/.m2/repository 2>/dev/null # 🟢 chỉ đọc
du -sh ~/Android/Sdk ~/Library/Android/sdk 2>/dev/null # 🟢 chỉ đọc
du -sh ~/.android/avd/* 2>/dev/null # 🟢 chỉ đọc — mỗi emulator vài GB
./gradlew --stop # 🟢 chỉ dừng daemon — BẮT BUỘC chạy trước khi xóa
# 🟢 chỉ cache build tăng tiến (find thay glob cho zsh)
find ~/.gradle/caches -maxdepth 1 -name 'build-cache-*' -exec rm -rf {} + 2>/dev/null
rm -rf ~/.gradle/daemon # 🟢 log của daemon
rm -rf ~/.gradle/caches # 🟡 build kế tiếp tải lại toàn bộ dependency (rất lâu)
rm -rf ~/.gradle/wrapper/dists # 🟡 mỗi project tải lại bản Gradle của nó
rm -rf ~/.m2/repository # 🟡 Maven — tương tự, và mất luôn artifact bạn `mvn install` cục bộ🔴
~/.m2/repositorycó thể chứa artifact nội bộ do bạn tự build và cài mà không repo nào tải lại được. Kiểm tra trước:find ~/.m2/repository -name '*.jar' -newer ~/.m2/settings.xml.
# 🔴 xóa emulator (AVD) — mất luôn dữ liệu bên trong máy ảo đó
# avdmanager list avd # 🟢 xem trước
# avdmanager delete avd -n <tên>docker system df # 🟢 LUÔN chạy trước khi prune
docker system df -v # 🟢 chi tiết từng image/volume
docker builder prune -af # 🟢 chỉ cache build — build lại chậm hơn, không mất gì
docker image prune # 🟢 chỉ xóa image dangling (<none>)
docker container prune # 🟡 xóa container đã dừng — mất dữ liệu ghi trong container layer
docker system prune # 🟡 container dừng + network thừa + image mồ côi + cache build
docker image prune -a # 🟡 xóa mọi image không có container dùng → phải pull lại
docker system prune -a --volumes # 🔴 XÓA CẢ VOLUME — mất database/local state của mọi projectdocker volume ls # 🟢 xem trước
docker volume rm <tên> # 🔴 mất hẳn dữ liệu trong volume đóTrên macOS, dung lượng chỉ thực sự trả lại cho ổ đĩa sau khi Docker Desktop thu nhỏ ổ ảo: Docker Desktop → Settings → Resources → Advanced → Disk image size (🟡), hoặc Troubleshoot → Reset to factory defaults (🔴 mất toàn bộ image + volume).
git count-objects -vH # 🟢 chỉ đọc — xem repo phình cỡ nào
# 🟢 chỉ đọc — tìm repo nặng
find ~ -name '.git' -type d -prune 2>/dev/null \
| xargs -I{} du -sh {} 2>/dev/null | sort -rh | head -15
git gc # 🟢 nén an toàn, giữ nguyên mọi thứ còn tham chiếu
git gc --aggressive --prune=now # 🟡 nén mạnh + xóa NGAY object mồ côi:
# mất reflog cũ → không `git reset` ngược lại được nữa🔴 Đừng chạy
--prune=nowkhi vừareset --hard/rebasehỏng và còn định cứu commit cũ bằnggit reflog. Nén xong là mất đường lùi.
Cache của VS Code/Cursor gắn với panel AI đã nằm ở §A2 — phần này chỉ là trình duyệt và JetBrains.
# Ubuntu
du -sh ~/.cache/google-chrome ~/.cache/mozilla ~/.cache/chromium 2>/dev/null # 🟢 chỉ đọc
# 🟢 chỉ cache trang, không đụng profile/mật khẩu (find thay glob cho zsh)
find ~/.cache/google-chrome -maxdepth 2 -name 'Cache' -exec rm -rf {} + 2>/dev/null
find ~/.cache/mozilla -maxdepth 3 -name 'cache2' -exec rm -rf {} + 2>/dev/null
# macOS
du -sh ~/Library/Caches/Google/Chrome ~/Library/Caches/Firefox 2>/dev/null # 🟢 chỉ đọc
# 🟢
find ~/Library/Caches/Google/Chrome -maxdepth 2 -name 'Cache' -exec rm -rf {} + 2>/dev/null
# JetBrains (kể cả cache của AI Assistant / Junie) — cả 2 OS
du -sh ~/.cache/JetBrains ~/Library/Caches/JetBrains 2>/dev/null # 🟢 chỉ đọc
# 🟡 IDE phải index lại toàn bộ project (lâu)
find ~/.cache/JetBrains ~/Library/Caches/JetBrains -maxdepth 2 \
\( -name 'caches' -o -name 'index' \) -exec rm -rf {} + 2>/dev/null🔴 Không xóa
~/.config/google-chromehay~/Library/Application Support/Google/Chrome— đó là profile (bookmark, mật khẩu, session), không phải cache. Chỉ xóa trong~/.cache/~/Library/Caches.
| Đường dẫn | Vì sao |
|---|---|
/System, /private/var/db (macOS) |
Ổ hệ thống chỉ đọc; nghịch vào là hỏng máy. |
~/Library (nguyên cụm, macOS) |
Chứa toàn bộ cấu hình + dữ liệu app, không phải chỉ cache. |
/var/lib (Ubuntu) |
Database của apt, Docker, MySQL… |
/boot |
Xóa nhầm kernel đang chạy → máy không boot được. |
~/.ssh, ~/.gnupg, ~/.aws, ~/.config/gh |
Khóa và credential, không tái tạo được. |
~/.claude/settings.json, ~/.claude.json, CLAUDE.md, ~/.claude/skills, ~/.claude/agents, ~/.claude/memory |
Cấu hình, skill, memory bạn tự viết — không tái tạo được. |
~/.config/Code/User/{settings.json,keybindings.json,snippets,History} |
Cấu hình IDE + local history có thể cứu code chưa commit. |
.env, ~/.config/*/auth.json, token của Copilot/Claude/Codex |
Xóa là phải đăng nhập lại toàn bộ. |
~/Library/Application Support/<app> |
Dữ liệu thật của app (không phải cache). |
| Docker volume | Database/local state của dự án. prune --volumes là 🔴. |
| Snapshot Timeshift / Time Machine | Là bản backup — mất luôn đường lùi. |
Trước mọi lệnh rm -rf có wildcard, chạy phiên bản “xem trước” bằng ls hoặc
du -sh trên đúng pattern đó. Với find … -exec rm, luôn chạy với -print
trước, đọc kỹ danh sách, rồi mới đổi thành -exec.
Lưu thành ~/bin/cleanup.sh, chmod +x ~/bin/cleanup.sh, chạy cleanup.sh.
Script chỉ làm các thao tác 🟢 và 🟡 nhẹ, và in dung lượng trước/sau.
Nó cố tình không làm bất cứ thao tác 🔴 nào: không đụng transcript AI, không
docker system prune -a --volumes, không xóa node_modules/.venv/target,
không gỡ model Ollama, không xóa snapshot. Những việc đó phải do bạn tự quyết định
theo §A–§D. Mỗi nhóm trong script được gắn nhãn ngay trong output khi chạy.
#!/usr/bin/env bash
# Chạy bằng bash kể cả trên macOS (shebang lo việc đó) — không phụ thuộc zsh.
set -uo pipefail
human() { df -h / | awk 'NR==2 {print $4" free of "$2}'; }
say() { printf '\n\033[1;36m▸ %s\033[0m\n' "$*"; }
run() { echo " $ $*"; "$@" >/dev/null 2>&1 || echo " (bỏ qua)"; }
echo "Trước: $(human)"
say "[🟢] Công cụ AI — chỉ cache, không đụng transcript/model"
for CODE in "$HOME/.config/Code" "$HOME/Library/Application Support/Code" \
"$HOME/.config/Cursor" "$HOME/Library/Application Support/Cursor"; do
[ -d "$CODE" ] || continue
run rm -rf "$CODE/Cache" "$CODE/CachedData" "$CODE/CachedExtensionVSIXs" \
"$CODE/GPUCache" "$CODE/Code Cache" "$CODE/logs"
done
run rm -rf "$HOME/.claude/shell-snapshots" "$HOME/.claude/statsig" \
"$HOME/.cache/claude-cli-nodejs" "$HOME/.codex/cache" \
"$HOME/.gemini/tmp" "$HOME/.cursor/ai-tracking"
run rm -rf "$HOME/.nv/ComputeCache" "$HOME/.triton/cache" "$HOME/.cache/torch/hub"
find /tmp -maxdepth 1 -name 'claude-*' -exec rm -rf {} + >/dev/null 2>&1
command -v ollama >/dev/null && echo " (ollama: chạy 'ollama list' để tự gỡ model không dùng)"
say "[🟢] Package manager Node — cache tải lại được"
command -v npm >/dev/null && run npm cache clean --force
command -v yarn >/dev/null && run yarn cache clean
command -v pnpm >/dev/null && run pnpm store prune
command -v bun >/dev/null && run bun pm cache rm
say "[🟢] Python / Go / Rust — cache build, không đụng modcache"
command -v pip >/dev/null && run pip cache purge
command -v go >/dev/null && run go clean -cache -testcache
command -v cargo >/dev/null && run rm -rf "$HOME/.cargo/registry/cache"
say "[🟢] Docker — chỉ cache build, KHÔNG prune image/volume"
command -v docker >/dev/null && run docker builder prune -af
case "$(uname -s)" in
Linux)
say "[🟢/🟡] Ubuntu — apt, journal, thùng rác (🟡)"
run sudo apt autoremove -y
run sudo apt autoclean
run sudo apt clean
run sudo journalctl --vacuum-time=3d
run find "$HOME/.local/share/Trash" -mindepth 1 -delete
run rm -rf "$HOME/.cache/thumbnails"
say "[🟢] Snap — chỉ xóa revision đã disabled"
LANG=C snap list --all 2>/dev/null | awk '/disabled/{print $1, $3}' \
| while read -r n r; do sudo snap remove "$n" --revision="$r" >/dev/null 2>&1; done
;;
Darwin)
say "[🟢/🟡] macOS — brew, DerivedData, thùng rác (🟡)"
command -v brew >/dev/null && run brew cleanup -s --prune=all
command -v brew >/dev/null && run rm -rf "$(brew --cache)"
run rm -rf "$HOME/Library/Developer/Xcode/DerivedData"
command -v xcrun >/dev/null && run xcrun simctl delete unavailable
run find "$HOME/.Trash" -mindepth 1 -delete
run sudo purge
;;
esac
echo
echo "Sau: $(human)"Khi ổ đĩa gần đầy, làm theo đúng thứ tự này:
df -h /— xác nhận thật sự hết chỗ (macOS: nhớ kiểm tra snapshot ở §C4).- Chạy lệnh đo công cụ AI ở đầu §A — nhóm này thường chiếm nhiều GB nhất mà
không ai để ý, và
apt/brewkhông chạm tới. - Nếu có Ollama/LM Studio:
ollama list→ gỡ model không dùng (§A3). Đây là bước duy nhất có thể giải phóng vài chục GB trong 1 phút. ncdu -x /hoặcdu -sh ~/* | sort -rh | head— tìm thủ phạm còn lại.- Chạy combo AI (§A6) rồi combo an toàn của OS (§B4 hoặc §C6).
- Quét
node_modules/target/DerivedData/.gradle/.venv(§D). docker system df→ prune nếu đang chiếm nhiều (§D6).- Gỡ hẳn app/SDK/phiên bản Node không còn dùng.
- Đo lại
df -h /; nếu vẫn thiếu, mới tính đến các mục 🔴.
Tài liệu dành cho Ubuntu/Debian và macOS (Intel & Apple Silicon).