macOS 使用久了,系统中难免积累大量不再需要的开发工具残留、过时的包管理器文件以及各类缓存。本文将系统性地介绍如何对 macOS 进行深度清理,并为系统升级做好准备。无论你是从 Monterey 升级到更新的系统版本,还是单纯想让 Mac 恢复清爽状态,这份指南都能帮到你。

关于 Homebrew 包的依赖管理与清理,可以参考 Homebrew 包管理与依赖清理指南。关于家目录下大量隐藏文件的说明,可以参考 macOS 家目录隐藏文件完全解析

提示:本文由 AI 根据对话历史整理,仅供参考

# MacPorts 完整清理与卸载步骤

如果你已经从 MacPorts 切换到 Homebrew,或者不再需要 MacPorts,彻底移除它可以避免路径冲突和 Zsh 补全报错等问题。

# 卸载所有已安装的 Ports

首先卸载通过 MacPorts 安装的所有软件包:

sudo port -f uninstall installed

# 清理缓存与编译文件

MacPorts 在安装软件时会产生大量临时编译文件和下载的源码包,使用以下命令进行清理:

sudo port clean all

如果只想清理特定类型的缓存:

# 清理临时编译文件
sudo port clean --all installed

# 清理所有下载的源码安装包
sudo port clean --distfiles all

# 删除 MacPorts 目录及配置文件

卸载完软件包后,需要手动删除 MacPorts 的根目录和相关配置:

# 删除 MacPorts 的整个根目录
sudo rm -rf /opt/local

# 删除相关的配置和隐藏文件夹
sudo rm -rf \
    /Applications/MacPorts \
    /Library/LaunchDaemons/org.macports.* \
    /Library/Receipts/MacPorts-* \
    /Library/Tcl/macports1.0 \
    ~/.macports

# 修复 .zshrc 中的 MacPorts 路径

MacPorts 会在 PATH 中添加 /opt/local/bin/opt/local/sbin。卸载后需要编辑 ~/.zshrc,删除或注释掉所有包含 /opt/local 的路径配置行。

关于 Zsh 终端配置和 PATH 环境变量的详细修复方法,可以参考 Zsh 终端配置与 Homebrew 环境修复

# MacPorts 核心组件说明

在清理过程中,你可能会在 /opt/local/bin 目录下看到一些残留文件。以下是它们的身份说明:

文件 说明
port MacPorts 的主程序,用于安装、卸载和管理软件包
port-tclsh MacPorts 运行逻辑所需的 Tcl 解释器
portindex 用于建立和维护 MacPorts 软件仓库索引
daemondo MacPorts 用来管理后台服务的守护进程
portmirror / portf MacPorts 的辅助工具

如果你决定彻底移除 MacPorts,这些核心组件会随 /opt/local 目录一并删除,无需单独处理。

# .NET 生态的彻底卸载

.NET 生态在 macOS 上涉及多个组件,分散在系统各处。仅删除主程序是不够的,需要逐一清理所有关联目录。

# dotnet 主程序和运行时

# 删除 dotnet 主程序和运行时
sudo rm -rf /usr/local/share/dotnet

# SDK 缓存与配置

# 删除 SDK 缓存和相关工具
sudo rm -rf /etc/dotnet

# 删除用户目录下的 dotnet 配置
rm -rf ~/.dotnet

# NuGet 缓存

NuGet 是 .NET 的包管理器,其缓存通常占用大量空间(1GB 到 5GB 甚至更多):

rm -rf ~/.nuget

如果 dotnet CLI 仍然可用,也可以使用官方命令清理:

dotnet nuget locals all --clear

# Mono Framework 卸载

Mono 是 .NET Framework 的开源实现,常由 Unity 游戏引擎、Xamarin 或 Visual Studio for Mac 安装。如果不再需要,可以执行以下命令卸载:

sudo rm -rf /Library/Frameworks/Mono.framework
sudo pkgutil --forget com.xamarin.mono-MDK.pkg

# Framework 文件说明

/Library/Frameworks 目录下,你可能会看到以下文件。了解它们的身份有助于判断哪些可以安全删除:

Framework 说明 是否可删除
CoreRepairCore.framework macOS 系统内部用于系统修复和组件验证的框架 不可删除
CoreRepairKit.framework 与 Apple 自助维修计划或售后诊断工具相关 不可删除
iTunesLibrary.framework 苹果提供的官方接口,允许第三方读取音乐库数据 体积小,建议保留
LightAquaBlue.framework macOS 图形界面 (Aqua) 的一部分,负责渲染视觉元素 不可删除
Mono.framework 第三方 .NET 运行环境,非系统自带 可删除(建议使用官方卸载方式)

# 清理环境变量

卸载完成后,编辑 ~/.zshrc,删除类似以下的路径配置行:

export PATH=$PATH:/usr/local/share/dotnet
export PATH=$PATH:~/.dotnet/tools

验证卸载是否干净:

dotnet --version
# 应该返回 command not found

# /usr/local 目录的安全清理

# 为什么不能删除整个 /usr/local

/usr/local 是 macOS 系统中一个非常基础的目录,即使它目前看起来是空的,也不能直接删除。原因如下:

  • 系统标准路径/usr/local 是类 Unix 系统中存放第三方软件的标准位置。许多安装程序(如 Python、Node.js 的官方安装包)默认依赖该目录存在。
  • 权限结构:直接删除可能导致权限混乱,影响后续软件安装。
  • 非 Homebrew 软件:TeX Live、MySQL 等通过非 Homebrew 渠道安装的软件可能驻留在此。

正确做法是清理 /usr/local 内部的内容,而不是文件夹本身。

# Homebrew 残留的清理

如果你已经从 x86 版 Homebrew(/usr/local)迁移到了 ARM 版(/opt/homebrew),可以清理以下 Homebrew 专属目录:

sudo rm -rf /usr/local/Homebrew
sudo rm -rf /usr/local/Cellar
sudo rm -rf /usr/local/opt
sudo rm -rf /usr/local/Caskroom
sudo rm -rf /usr/local/var/homebrew

# 清理死链接

macOS 自带的 find 命令(BSD 版本)不支持 -xtype 参数。在 Mac 上清理死链接,需要使用以下替代命令:

# 查看所有死链接(先预览)
find /usr/local -type l ! -exec test -e {} \; -print

# 确认无误后删除死链接
find /usr/local/bin -type l ! -exec test -e {} \; -delete
find /usr/local/lib -type l ! -exec test -e {} \; -delete

命令说明:

  • -type l:查找所有符号链接
  • ! -exec test -e {} \;:筛选出指向目标已不存在的链接(即死链接)
  • -print / -delete:预览或删除

注意:Linux 上常用的 find -xtype l 在 macOS 上会报错 unknown primary or operator。如果需要 GNU 版本的 find,可以通过 brew install findutils 安装后使用 gfind 命令。

# /usr/local/share 残留清理

/usr/local/share 存放不依赖于特定硬件架构的共享数据。以下是常见残留及其说明:

目录 来源 清理命令
dotnet .NET 运行时的共享资源 sudo rm -rf /usr/local/share/dotnet
fish Fish Shell 的配置和补全脚本 sudo rm -rf /usr/local/share/fish
zsh Zsh 补全脚本和函数(需谨慎处理) 建议仅清理其中的死链接

# /usr/local/lib 残留清理

目录 说明 清理建议
gdk-pixbuf-2.0 图像加载和处理的底层库(GNOME/GTK 生态) 如果不使用开源图形软件(GIMP、Inkscape 等),可以删除。建议先改名观察

对于 gdk-pixbuf-2.0,如果不确定是否有应用依赖它,可以先用"改名测试法":

# 模拟删除
sudo mv /usr/local/lib/gdk-pixbuf-2.0 /usr/local/lib/gdk-pixbuf-2.0.bak

# 如果发现某个应用报错,恢复即可
sudo mv /usr/local/lib/gdk-pixbuf-2.0.bak /usr/local/lib/gdk-pixbuf-2.0

# /usr/local/bin 残留清理

/usr/local/bin 中常见的残留工具及处理建议:

文件 用途 建议
activate-global-python-argcomplete Python 命令行自动补全工具 可删除
register-python-argcomplete argcomplete 注册脚本 可删除
pip / pip3.9 Python 包管理器(可能指向已不存在的解释器) 可删除
em.py EmPy 文本模板系统,常见于 ROS 开发 可删除
hexo 静态博客框架 如不维护博客可删除
pandoc / pandoc-server / pandoc-lua 文档转换工具 如不需要文档转换可删除
youtube-dl 命令行视频下载工具 按需保留
rar / unrar RAR 压缩包处理工具 如有图形化解压软件可删除
RemoteUpdateManager Adobe Creative Cloud 远程更新组件 如果还有 Adobe 软件则必须保留

# /opt 目录清理

# /opt/R(R 语言安装目录)

/opt/R 是 R 语言的安装目录。在类 Unix 系统中,/opt 代表 "optional",专门存放不属于操作系统核心的第三方大型软件包。

如果确定不再使用 R 语言进行数据分析,可以删除该目录:

# 如果通过 Homebrew 安装
brew uninstall r

# 如果是官方安装包,手动删除
sudo rm -rf /opt/R

验证 R 是否正在使用该目录:

which R

# /opt/X11(XQuartz)

/opt/X11 是 XQuartz 的安装目录。XQuartz 提供了 X Window System 支持,允许在 Mac 上运行需要 X11 环境的开源软件(如旧版 Inkscape、GIMP、Wireshark 等)。

如果确认不再需要 X11 环境:

  1. 先检查"应用程序"文件夹中是否有 XQuartz
  2. 使用 XQuartz 官方卸载方式或 AppCleaner 来清理
  3. 删除后,同时清理 ~/.Xauthority(X11 授权文件)和 PATH 中的 /opt/X11/bin

# DMG vs PKG:安装方式的区别与选择

理解 macOS 上两种主要安装方式的区别,有助于理解为什么某些软件的残留如此难以清理。

# 核心对比

特性 DMG(拖拽安装) PKG(向导安装)
工作原理 挂载为虚拟磁盘,将 App 拖入 Applications 通过安装向导将文件分发到系统各处
安装位置 通常只在 /Applications 散落在 /usr/local/Library 等多个位置
卸载难度 极易(直接删除 .app 文件) 较难(需手动查找并删除各处残留)
权限要求 低(通常不需要管理员密码) 高(通常需要管理员密码)
适用场景 普通应用程序 需要系统级配置的软件(驱动、SDK、运行时)
典型代表 Chrome、微信、Telegram Office、Adobe、.NET、驱动程序

# PKG 安装后的残留问题

PKG 安装的软件没有自带的卸载机制。删除 /Applications 中的图标后,它在 /usr/local/Library/Frameworks 等位置留下的文件仍然存在。这也是前文中 dotnetMono.framework 等需要手动清理的根本原因。

建议:在下载软件时,如果同时提供 DMG 和 PKG 两个版本,优先选择 DMG 版本。

# Ghostscript 的 PKG 卸载脚本解析

Ghostscript 是一个典型的通过 PKG 安装的软件。由于 macOS 不提供原生的 PKG 卸载功能,需要借助系统的安装记录(BOM 文件)来逆向卸载。以下是一个卸载脚本的核心逻辑:

uninstall_ghostscript () {
    # 通过 pkgutil 查询安装记录中的 BOM (Bill of Materials) 文件
    bom_usr_local=$(pkgutil --bom $1 | grep -F Ghostscript)

    # 解析 BOM 文件,列出所有已安装的文件路径
    # 使用 sed 将相对路径转为绝对路径
    lsbom -s -f $bom_usr_local | grep -F -v ghostscript | sed 's_^\.__' | while read filename; do
        if [[ -e $filename ]]; then
            # 移到垃圾桶而不是直接删除(提供安全保障)
            command mv -v "$filename" ~/.Trash
        else
            echo "$filename is already removed."
        fi
    done

    # 处理共享资源目录
    if [[ -e "/usr/local/share/ghostscript" ]]; then
        command mv -v /usr/local/share/ghostscript ~/.Trash
    fi
}
# 使用方式:传入 Ghostscript 的包 ID
uninstall_ghostscript $1

使用前需要先查找 Ghostscript 的包 ID:

pkgutil --pkgs | grep -i ghostscript

如果 Ghostscript 是通过 Homebrew 安装的,直接使用 brew uninstall ghostscript 即可。

# 其他清理项

# git-lfs 的正确卸载步骤

卸载 git-lfs 需要先取消 Git 配置,再删除二进制文件,否则后续使用 Git 时可能遇到报错。

第一步:取消 Git LFS 全局配置

git lfs install --system --uninstall  # 取消系统级安装
git lfs uninstall                     # 取消当前用户的全局钩子配置

第二步:删除二进制文件

# 如果通过 Homebrew 安装
brew uninstall git-lfs

# 如果手动安装
sudo rm /usr/local/bin/git-lfs

第三步:清理残留(可选)

# 删除共享配置文件
sudo rm -rf /usr/local/share/git-lfs

# 删除 man 手册
sudo rm /usr/local/share/man/man1/git-lfs*
sudo rm /usr/local/share/man/man5/git-lfs*

验证卸载

git lfs version
# 应该返回 command not found

注意:如果某个本地 Git 仓库已经使用了 LFS 管理大文件,卸载后那些大文件将显示为文本指针而非原始内容。

# /private/tmp 的安全清理

/private/tmp 是 macOS 存放临时文件的核心目录。许多应用和系统服务在运行时会使用该目录。

关键原则:可以清理里面的文件,但绝对不能删除文件夹本身。

最安全的清理方式——重启法:macOS 在每次重启时会自动清理 /private/tmp 中过期的临时文件。

手动清理方式(如果必须):

cd /private/tmp
# 删除文件内容,不删目录本身
# 某些文件会提示"正在使用无法删除",这是正常的
sudo rm -rf *

该目录中常见的内容包括:

  • com.apple.iCloud...:iCloud 同步临时数据
  • PKInstall...:安装 .pkg 软件时的临时解压包(通常是空间占用大户)
  • powerlog:电量监控相关日志

# Vim 配置清理

如果不再需要 Vim 的个性化配置或插件,可以将其恢复到"出厂设置":

# 删除基础配置文件
rm ~/.vimrc

# 删除插件和数据文件夹
rm -rf ~/.vim

# 删除 Vim 的"最近使用文件"列表
rm ~/.vim_mru_files

如果同时使用了 Neovim,一并清理:

rm -rf ~/.config/nvim
rm -rf ~/.local/share/nvim
rm -rf ~/.local/state/nvim
rm -rf ~/.cache/nvim

如果不确定是否需要保留,可以先备份:

mv ~/.vimrc ~/.vimrc.bak
mv ~/.vim ~/.vim.bak

# macOS 升级前的检查清单

如果你计划从 Monterey(12)升级到更新的系统版本,以下检查清单可以帮助你做好准备。

# 清理残留路径

检查 $PATH 中是否存在已删除软件的路径。这些路径通常来自以下位置:

# 检查系统级路径配置
ls /etc/paths.d

# 检查用户级配置文件
cat ~/.zshrc
cat ~/.zprofile
cat ~/.zshenv

常见的应清理路径:

路径 来源 处理建议
/opt/local/bin MacPorts 残留 删除对应 paths.d 文件或 zshrc 配置行
/usr/local/share/dotnet .NET 残留 删除
/opt/X11/bin XQuartz 残留 删除
Mono.framework/.../Commands Mono 残留 删除
VMware Fusion.app/.../Public VMware 残留 删除
Wireshark.app/.../MacOS Wireshark 残留 删除

如果在 ~/.zshrc 中找不到这些路径,它们很可能藏在 /etc/paths.d/ 中。PKG 安装的软件(如 TeX Live、.NET、Wireshark)常在此创建文件:

# 查看 /etc/paths.d 中的文件
ls /etc/paths.d

# 删除已卸载软件的路径文件
sudo rm /etc/paths.d/dotnet   # 示例

# 理解 /private/var/folders

在清理过程中你可能会遇到 /private/var/folders/yx/llzrrk...0000gn 这样的路径。这是 macOS 的系统级临时缓存目录:

  • /private/var/folders/ 是根目录,只有系统和文件拥有者可以访问
  • 两字符的子目录(如 yx)是随机生成的索引
  • 长字符串是为当前用户生成的唯一标识符

该目录下通常包含三个子文件夹:

  • C (Caches):应用程序缓存
  • T (Temporary items):临时文件(如从邮件中打开的附件)
  • 0:底层服务的持久性数据

不建议手动删除此目录。这里的文件由正在运行的程序使用,强行删除可能导致应用崩溃。正确的清理方式是重启电脑,macOS 会在启动阶段自动清理过时的临时文件。

# 升级前的最终确认

  1. 备份重要文件:确保 ~/.ssh(SSH 密钥)和 ~/.zshrc(终端配置)已备份
  2. 清理开发缓存:删除 ~/.npm~/.yarn~/.nuget 等大型缓存目录
  3. 重启电脑:触发系统自清理机制,清除 /private/var/folders 下的过时缓存
  4. 清空垃圾桶:重启后清空一次垃圾桶
  5. 预留磁盘空间:大版本升级建议预留 35GB 以上的可用空间
  6. 检查软件兼容性:旧版开发工具(如 Oracle JRE、早期的 .NET Core)在新系统上可能需要重新安装 ARM64 原生版本

完成以上清理和检查后,你的 Mac 已经处于一个轻装上阵的状态,可以安心进行系统升级了。升级完成后,建议重新通过 Homebrew 安装所需的开发工具,以确保使用的是针对当前系统和架构优化的最新版本。