Skip to content

Latest commit

 

History

History
479 lines (340 loc) · 24.3 KB

README_CN.md

File metadata and controls

479 lines (340 loc) · 24.3 KB

macOS · Windows

Mole

Mac 深度清理、应用卸载、系统优化、磁盘分析与状态监控,免费开源命令行,另有原生 Mac App

English · 中文 · 繁體 · 日本語 · 한국어 · Deutsch · Français · Українська · Русский

Stars Version License Commits Twitter Telegram

Mole 清理效果

💡 这个仓库是免费开源的命令行工具(mo),喜欢图形界面的话可以单独下载 Mole for Mac,支持删除前逐项确认、实测 800 多款软件的卸载残留、系统维护、逐层分析磁盘空间、实时状态监控,以及在支持的 Mac 上控制风扇,Windows 上对应的原生 App 是 Mole for Windows,brew install mole 只会安装命令行工具。

功能

  • 多合一命令行:把 CleanMyMac、AppCleaner、DaisyDisk 与 iStat Menus 的日常用法放进一个终端命令
  • 深度清理:清除系统缓存、应用日志与卸载残留,释放磁盘空间
  • 应用卸载:移除应用程序,同步清理配置文件与自启动项
  • 磁盘分析:终端交互式浏览目录层级,定位占用空间的大文件
  • 系统优化:刷新 DNS、QuickLook 与图标缓存,优化系统数据库
  • 实时监控:在终端看板中实时查看 CPU、内存、磁盘读写、网络流量与进程

快速开始

Mole 支持 macOS 12 及更高版本,兼容 Intel 与 Apple Silicon 芯片,Homebrew 不再支持你的 macOS 版本时改用脚本安装。

通过 Homebrew 安装

brew install mole

通过脚本安装

curl -fsSL https://raw.githubusercontent.com/tw93/mole/main/install.sh | bash

Windows 上安装(Windows CLI)

iwr -useb https://raw.githubusercontent.com/tw93/Mole/windows/quick-install.ps1 | iex

Mole 只通过 Homebrew、这个 GitHub 仓库和 Mac 版、Windows 版官网 mole.fit 发布,自称基于 Mole 的其他 App,或者让你往终端里粘贴一段编码命令的网站,都和 Mole 无关。

常用命令

mo                           # 打开交互式菜单
mo clean                     # 深度清理与已卸载应用残留
mo uninstall                 # 卸载应用及其残留
mo optimize                  # 刷新系统缓存与服务
mo analyze                   # 磁盘空间浏览(也可写 mo analyse)
mo status                    # 实时系统健康看板
mo purge                     # 清理项目构建产物
mo installer                 # 查找并删除安装包
mo slim                      # 移除通用应用里的 Intel 代码

mo touchid                   # 配置终端 Touch ID 指纹提权
mo completion                # 配置命令行 Tab 键自动补全
mo update                    # 检查并更新 Mole
mo update --nightly          # 更新到最新未发布的开发版(仅限脚本安装)
mo remove                    # 从系统中完全卸载 Mole
mo --help                    # 查看帮助信息
mo --version                 # 查看已安装版本

安全预览

mo clean --dry-run
mo uninstall --dry-run
mo optimize --dry-run
mo purge --dry-run
mo installer --dry-run
mo slim --dry-run
mo history
mo history --json

mo clean --dry-run --debug   # 安全预览 + 详细诊断日志
mo optimize --whitelist      # 管理受保护的优化规则
mo clean --whitelist         # 管理受保护的缓存白名单
mo purge --paths             # 配置代码项目扫描目录
mo analyze /Volumes          # 仅分析外接移动硬盘或磁盘卷
mo analyze /private/tmp      # 仅查看临时目录(不自动清理)
其他安装选项

想装特定版本就传入 Releases 页面 里的任意 Tag,带不带开头的 V 都行,想跟开发分支就传 main:

curl -fsSL https://raw.githubusercontent.com/tw93/mole/main/install.sh | bash -s -- 1.51.0
curl -fsSL https://raw.githubusercontent.com/tw93/mole/main/install.sh | bash -s -- main

main 会安装默认分支上还没发布的代码,可能不稳定,latest 只是 main 的旧别名,并不会安装最新稳定版。

安装脚本默认装到 /usr/local/bin,可能需要输入管理员密码。希望以后的 mo update 不用输密码,可以装到用户目录:

mkdir -p "$HOME/.local/bin"
curl -fsSL https://raw.githubusercontent.com/tw93/mole/main/install.sh | bash -s -- --prefix "$HOME/.local/bin"
export PATH="$HOME/.local/bin:$PATH"

记得把 export PATH 加到 ~/.zshrc 或相应的终端配置文件。Mole 更新的是你运行的那份安装,之后会一直用这个目录,需要改系统文件的命令仍可能要管理员权限。

Nix

在 macOS 上,Nix 用户可从 main 分支安装 flake,其中包含还没发布的改动:

nix profile install github:tw93/mole/main#mole
nix profile upgrade mole
nix profile remove mole

声明式配置可以把 github:tw93/mole/main 加为 flake input,用它的 packages.${system}.mole 包。Nix 管理的安装要通过 Nix 升级和卸载,mo update 和 mo remove 不会改动它。

安全机制

Mole 会删除文件,所以会先校验路径、保护共享和系统目录,需要时才请你确认,无法确认安全的项目一律跳过或拒绝。

  • clean、uninstall、purge、installer、slim 与 remove 会删除文件,可先用 --dry-run 预览,需要时加上 --debug
  • 日常运行 无需 sudo,仅在触及系统级清理时按需请求管理员权限
  • mo uninstall、mo analyze 与 mo slim 在确认后默认将删除项移入废纸篓;clean、purge 与 installer 为永久删除,mo uninstall --permanent 可跳过废纸篓
  • 清理操作记录在 ~/Library/Logs/mole/operations.log 中,可通过 mo history 查看,或设置 MO_NO_OPLOG=1 禁用
  • 可通过 mo clean --whitelist 保护指定缓存,或使用 mo optimize --whitelist 排除维护项
  • 白名单文件无法读取时,clean、purge 和 optimize 会直接停止,不会在没有白名单的情况下继续执行

漏洞报告方式、安全边界与当前限制见 SECURITY.md 与 SECURITY_AUDIT.md。

功能说明

以下展示为缩减示例,具体显示项、大小与跳过原因取决于你的 Mac 实际环境。

深度清理(Clean)

mo clean 扫描并清理已知可安全删除的缓存、日志、临时文件、开发工具缓存以及已卸载应用的残留,默认会清空 ~/.Trash,想保留就在 mo clean --whitelist 里勾选 Trash,同一个菜单也用来保护想留下的缓存,各卷的废纸篓(如 /Volumes/*/.Trashes)不会随之清空。选好的项会写进 ~/.config/mole/whitelist,想加自定义路径时先打开菜单按回车保存一次,再往文件里每行追加一个路径,文件一旦存在就会替换可选默认规则,内置安全保护仍然生效。

$ mo clean

Clean Your Mac

⚙ Apple Silicon | Free space: 219.0GB

➤ User essentials
  ✓ User app cache · 18 items, 2.4GB
  ✓ User app logs · 7 items, 12.8MB
  ✓ Trash · emptied, 9 items

➤ App caches
  ✓ App Store cache · 8 items, 248.5MB

➤ Browsers
  ✓ Safari cache · 24 items, 642.1MB
  ✓ Chrome cache · 31 items, 1.2GB

➤ Developer tools
  ✓ npm cache · cleaned
  ◎ pnpm cache · skipped (pnpm busy)

======================================================================
Cleanup complete
Tracked cleanup: 4.5GB | Items cleaned: 97 | Categories: 4
Free space: 223.5GB (+4.5GB)
======================================================================

应用卸载(Uninstall)

mo uninstall 移除已安装的应用,以及 Mole 能确认属于这个应用的相关文件;若同一应用的另一个已安装副本仍在使用这些文件,会自动保留,应用此前已被手动删除的话,运行 mo clean 扫描残留。

设置、插件等个人数据默认保留,在卸载预览页按 D 可逐项选择要删除的数据路径,用 mo uninstall --with-data 时这些数据会预先选中,浏览器配置文件与 App Group 容器除外,预览里单独列出,仍可按 D 保留任意路径,卸载后若发现 shell、Hook 或 MCP 配置仍引用已删除的路径,只提示文件和行号,不修改配置。

$ mo uninstall

Select Apps to Remove  1/3 selected

➤ ● Photoshop 2024                4.20GB | 2mo ago
  ○ IntelliJ IDEA                 2.80GB | 3d ago
  ○ Premiere Pro                  3.40GB | 2w ago

Files to be removed:

✓ Photoshop 2024, 4.20GB
  ✓ /Applications/Adobe Photoshop 2024/Adobe Photoshop 2024.app

Personal data kept:
  ~/Library/Application Support/Adobe/Adobe Photoshop 2024
  ~/Library/Preferences/com.adobe.Photoshop.plist

D choose personal data

======================================================================
Uninstall complete
Removed 1 app, freed 4.20GB: Photoshop 2024
======================================================================

系统优化(Optimize)

mo optimize 对支持的 Finder、网络、数据库与 macOS 服务执行范围明确的维护,非必要、当前执行不安全或不可用的任务会跳过并说明原因。可用 mo optimize --whitelist 排除任务或路径模式,例如常驻挂载的 /Volumes/mail,避免它出现在推出列表里。

$ mo optimize

Optimize

⚙ System  18/32 GB RAM | 616/926 GB Disk | Uptime 6d

PERFORMANCE DIAGNOSIS
  ✓ No sustained high-CPU bottleneck detected

➤ Finder Cache Refresh
  → QuickLook thumbnails refreshed
  → Icon services cache rebuilt

➤ Network Cache Refresh
  → DNS cache refreshed

➤ Database Optimization
  ◎ Close these apps before database optimization: Safari

➤ Disk Health
  → Disk verify skipped

======================================================================
Optimization Complete
Applied 2 optimizations
13 unchanged | 3 skipped | 1 unavailable
======================================================================

磁盘分析(Analyze)

mo analyze 打开终端交互式磁盘分析器,支持方向键与 Vim 快捷键浏览、快速过滤、多选标记、Finder 预览与移入废纸篓。外置磁盘默认不在概览中显示,可运行 mo analyze /Volumes 或指定挂载路径单独查看,mo analyze /private/tmp 只检查临时目录,不会把它们变成自动清理目标。逐文件扫描时,共享全部数据块的 APFS 克隆只计一次,文件夹快速估算仍可能重复计算共享块。

以 + 结尾的大小是部分扫描里实际测到的字节数,unknown 表示没法测出大小。因临时超时中断的条目不会覆盖已有完整缓存,后续刷新可自动补全。macOS 不允许终端读取的文件夹会一直标为部分扫描,直到访问权限改变。终端界面只列出最大的 30 项,读不到的条目可能不在这 30 项里,但总量仍会标为部分扫描,JSON 格式输出则包含所有扫描条目。

mo analyze --json /path 的结果本身和其中每一项都带有 scan_status(complete、partial 或 unavailable)。数值大小是实际测到的字节数,unavailable 时的 0 也不代表目录为空。未完成的扫描仍返回退出码 0,脚本要看 scan_status 判断结果是否完整。完整性以 Mole 现有的扫描排除规则为界,不保证是文件系统的原子快照。

$ mo analyze

Analyze Disk  (302.1GB free)
Select a location to explore:

 ▶  1. ████████████████████████  47.9%  |  Home                       75.4GB
    2. ███████████               22.0%  |  User Library               34.6GB
    3. ███████                   14.2%  |  Applications               22.4GB
    4. █████                     10.7%  |  System Library             16.9GB
    5. ███                        5.2%  |  Old Downloads (90d+)       8.2GB  >3mo

状态监控(Status)

mo status 提供只读系统硬件仪表盘,涵盖 CPU、系统负载、磁盘读写、网络流量、电源与进程。

当默认 IPv4 路由走 VPN 或隧道接口时,流量图表会统计这个接口,避免和物理网卡重复计算。JSON 输出保留每个接口的速率,包括路由经过的隧道,空闲的非默认隧道不显示。

$ mo status

Mole Status  Health ● 92  MacBook Pro · M4 Pro · 32GB · macOS 26

⚙ CPU                                    ▦ Memory
Total   ████████████░░░░░░░  45.2%       Used    ███████████░░░░░░░  58.4%
Load    0.82 / 1.05 / 1.23 (8 cores)     Total   18.7 / 32.0 GB
Core 1  ███████████████░░░░  78.3%       Free    ████████░░░░░░░░░░  41.6%
Core 2  ████████████░░░░░░░  62.1%       Avail   13.3 GB

▤ Disk                                   ⚡ Power
Used    █████████████░░░░░░  67.2%       Level   ██████████████████  100%
Free    156.3 GB                         Status  Charged
Read    ▮▯▯▯▯  2.1 MB/s                  Health  Normal · 423 cycles
Write   ▮▮▮▯▯  18.3 MB/s                 Temp    58°C · 1200 RPM

⇅ Network                                ▶ Processes
Down    ▁▁█▂▁▁▁▁▁▁▁▁▇▆▅▂  0.54 MB/s      Zombies 3 · Chrome (4242) ×3
Up      ▄▄▄▃▃▃▄▆▆▇█▁▁▁▁▁  0.02 MB/s      Code       ▮▮▮▮▯  42.1%
Proxy   HTTP · 192.168.1.100             Chrome     ▮▮▮▯▯  28.3%

健康评分综合了 CPU、内存、磁盘余量、SMART 状态、I/O 读写、温度、电池状况与运行时间,按 k 切换看板小猫,按 c 调整显示的 CPU 核心数,按 q 退出,设置会自动保存。

JSON、NDJSON 与进程告警
  • mo analyze --json ~/Documents:单次输出指定路径的磁盘分析 JSON
  • mo status --json:单次输出系统状态快照 JSON
  • mo status | jq '.health_score':当输出被管道重定向时自动切换为 JSON 模式
  • mo status --watch --interval 2s:持续流式输出 NDJSON(换行分隔的 JSON)
  • mo history --json:以 JSON 格式输出历史清理日志。每个会话带有 run_id(不透明字符串,没有记录身份时为空)和 attribution,能识别的运行是 run,旧版按命令分组的是 command,旧标记分不清中断和重叠运行时是 ambiguous。记录下来的操作仍然都能看到,但 ambiguous 的计数没法可靠地分到单次运行上。ended_at 为空表示没有记录到结束标记
$ mo analyze --json ~/Documents
{
  "path": "/Users/you/Documents",
  "overview": false,
  "entries": [
    { "name": "Library", "path": "...", "size": 80939438080, "is_dir": true }
  ],
  "large_files": [
    { "name": "backup.zip", "path": "...", "size": 8796093022 }
  ],
  "total_size": 168393441280,
  "total_files": 42187
}

$ mo status --json
{
  "host": "MacBook-Pro",
  "health_score": 92,
  "cpu": { "usage": 45.2, "logical_cpu": 8 },
  "memory": { "total": 34359738368, "used": 20078972109, "used_percent": 58.4 },
  "disks": [],
  "process_collected_at": "2026-08-29T12:30:00Z",
  "process_stale": false,
  "zombie_count": 3,
  "zombie_parents": [
    { "pid": 4242, "name": "Google Chrome for Testing", "count": 3 }
  ],
  "zombie_parents_complete": true,
  "uptime": "3d 12h 45m"
}

僵尸进程诊断是只读的,不会结束进程,也不影响健康分。Mole 还没成功拿到一次进程样本时,process_collected_at、process_stale、zombie_count 和 zombie_parents_complete 都不会出现,zombie_parents 为 null。之后的 fast/watch 快照会沿用最近一次成功的样本,保留它原来的 process_collected_at 并设 process_stale: true,拿到新的进程样本后变回 false。0 表示 Mole 实际测过,没有僵尸进程。父进程摘要最多列出三个已知的父进程,zombie_parents_complete: false 表示归属信息拿不到、不完整或被截断。

如果某个指标采集出错,mo status --json 仍会输出其他可用指标,将错误记录在 stderr 中并退出 0,--watch 也是这样继续输出,只有 CPU、内存、磁盘和进程指标全都拿不到,或者 JSON 输出失败时才退出 1。

持续高 CPU 的进程会有提示,用 --proc-cpu-threshold、--proc-cpu-window 或 --proc-cpu-alerts=false 调整或关闭。

项目清理(Purge)

mo purge 自动查找可随时重新构建的项目生成目录(如 node_modules、target、.build、build 与 dist)。按项目归类展示,只永久删除你勾选确认的产物,不经过废纸篓,最近 7 天内有改动或无法确认改动时间的产物默认不勾选。扫描优先用 fd,没有时回退到 find,包含部署密钥、嵌套 Git 仓库或 Git 追踪文件的目录会受保护,非交互式运行需加 --yes,可先用 mo purge --dry-run 预览候选目录。

使用 Page Up/Down 或 h/l 翻页,[/] 在项目间跳转,X 跳过当前项目并前进到下一个,/ 搜索项目路径与产物名称,n 跳到下一个匹配且不改变已选项,回车打开最终路径确认界面。显示的空间是估算值,没测出大小的产物和不完整的扫描会单独标明。

Purge 示例输出
$ mo purge

Purge Project Artifacts

Select Artifacts to Purge
6.00GB, 2 selected

➤ ● ┌ ~/Projects/website        3.80GB | node_modules | 28d
  ○ └ ~/Projects/website         186MB | dist         | <1d
  ● ┌ ~/Projects/rust-app       2.20GB | target       | 2mo
  ○ └ ~/Projects/rust-app         22MB | dist         | <7d

======================================================================
Purge complete
Estimated space freed: 6.00GB | Items: 2 | Free: 223.5GB
======================================================================
自定义扫描路径

运行 mo purge --paths 配置扫描目录,或直接编辑 ~/.config/mole/purge_paths:

~/Documents/MyProjects
~/Work/ClientA
~/Work/ClientB

配置了自定义路径就只扫描这些目录,没配置时用默认目录(如 ~/Projects、~/GitHub、~/dev 以及受支持的 agent worktree 目录),扫描中途得到的不完整结果不会保存。产物扫描深度为配置根目录下 6 层,更深的项目可以加一个更近的根目录,Purge 只删除 worktree 里可重建的产物,不会删除 worktree 目录本身。

安装包清理(Installer)

mo installer 自动查找下载目录、桌面、Homebrew 缓存、iCloud、Mail、Telegram 等受支持位置中的 DMG、PKG、MPKG、ISO、XIP 与安装器 ZIP 文件,清理前列出各文件大小与来源。扫描有总时长上限,出错或超时就直接放弃,不在不完整的数据上操作,损坏或无法读取的 ZIP 压缩包会跳过,扫描根目录可以是符号链接,但不会跟随它下面的符号链接,最终删除前还会再校验一次,确保文件未发生变动。

Installer 示例输出
$ mo installer

Select Installers to Remove, 3.83GB, 5 selected

➤ ● Photoshop_2024.dmg          1.20GB | Downloads
  ● IntelliJ_IDEA.dmg          850.6MB | Downloads
  ● Illustrator_Setup.pkg      920.4MB | Downloads
  ● PyCharm_Pro.dmg            640.5MB | Homebrew
  ● Acrobat_Reader.dmg         220.4MB | Downloads
  ○ AppCode_Legacy.zip         410.6MB | Downloads

======================================================================
Installers cleaned
Removed 5 installers, freed 3.83GB
======================================================================

应用瘦身(Slim)

mo slim 在 Apple Silicon Mac 上移除通用应用里的 Intel 代码。它列出归你所有、使用 Developer ID 签名的应用及各自的 Intel 代码大小,只处理你选中的应用。每个应用先在副本上瘦身,只动主程序和自带签名的嵌套代码,副本保留 Apple Silicon 代码并通过代码签名与 Gatekeeper 检查后才替换原应用,原应用移入废纸篓。App Store 应用、Apple 应用、设为使用 Rosetta 打开的应用、属于其他用户的应用以及正在运行的应用都不会处理。不需要安装开发工具,应用更新后 Intel 代码会回来。

快捷启动器

Raycast 与 Alfred 配置

安装快捷启动器(Clean、Uninstall、Optimize、Analyze 与 Status):

curl -fsSL https://raw.githubusercontent.com/tw93/Mole/main/scripts/setup-quick-launchers.sh | bash

脚本会添加 Raycast 命令,检测到 Alfred 配置时还会添加带有 clean、uninstall、optimize、analyze 与 status 关键词的 Alfred Workflow。

Raycast 装好后要手动设置一次:

  1. 打开 Raycast 设置 > Extensions > Script Commands。
  2. 添加 ~/Library/Application Support/Raycast/script-commands 目录。
  3. 在 Raycast 中点击 Reload Script Directories。

启动器会自动适配常见终端(Terminal、iTerm2、Alacritty、kitty、WezTerm、Ghostty、Hyper、WindTerm、Warp)。可通过 MO_LAUNCHER_APP=<名称> 指定终端,也可以直接在 Kaku 中运行。

社区反馈

感谢所有参与 Mole 开发与维护的贡献者,去关注一下他们吧 ❤️

Mole 贡献者



来自 X (Twitter) 用户的真实使用反馈:

社区反馈

观看 PAPAYA 電腦教室 制作的 Mole 教学视频。

支持项目

  • 购买 Mole for Mac 是支持 Mole 持续开发最直接的方式
  • 如果 Mole 帮到了你,欢迎点个 Star、分享给朋友,或在 GitHub 提交 Issue 和 PR
  • 我养了两只猫,汤圆和可乐,如果 Mole 用着顺手,欢迎投喂她们一顿 罐头 🥩
已经投喂的好心人 🐱
赞助者

开源协议

Mole 基于 GPL-3.0 协议开源(详见 LICENSE),任何修改与分发的版本需要保持相同的开源协议,如果你将 Mole 分叉为其他独立产品,请使用不同名称并注明出处。Mole for Mac 是独立的闭源 App,Mole 会长期维护下去。