从这里开始

Mac 上的重复文件:为什么 APFS 克隆改变了算法

在 APFS 上,访达拷贝出的文件往往是共享空间的克隆,删除后几乎不释放空间。如何安全地找到真正的重复文件,哪些不该动。

阅读约需 5 分钟MoreRoom 团队,Yando Pte. Ltd.以 Markdown 格式查看本页

要点速览

  • 在 APFS 上,访达的“复制”以及在同一宗卷内的拷贝会创建克隆,与原文件共享数据块,而不是重新拷贝一份。
  • 只要另一份还在,删除克隆几乎不会释放空间,因为共享的数据块仍在使用中。
  • 重复文件查找工具比较的是内容而不是数据块,因此可能报告出好几 GB 实际上永远不会出现在磁盘上的“可节省空间”。
  • 用 shasum -a 256 之类的校验和确认是否真的重复,并保留 App 和资料库实际引用的那一份。
  • 切勿手动删除“照片”图库或 App 包内部的重复文件;请改用“照片”自带的“重复项”相簿。

如何在 Mac 上安全地找到并移除真正的重复文件

  1. 先找大文件. 在访达中选取“文件”›“新建智能文件夹”,添加“文件大小”“大于”500 MB 的条件,再按名称或大小排序,找出可能成对的文件。
  2. 确认内容完全相同. 在“终端”中对两个文件运行 shasum -a 256。校验和相同说明内容相同;校验和不同则说明它们并非重复文件。
  3. 检查它们是否在同一宗卷上. 在同一个 APFS 宗卷上创建的副本可能是克隆。删除其中一个可能几乎不释放空间,所以请在删除前后对比可用空间。
  4. 保留被引用的那一份. 保留位于项目、资料库或 App 所用文件夹中的那一份,把另一份移到废纸篓;切勿移动“照片”图库这类包内部的文件。
  5. 检查结果,再清倒废纸篓. 记下“磁盘工具”中的可用空间,清倒废纸篓,再进行对比。如果没有变化,说明这些文件是克隆,删除它们没有带来任何收益。

APFS 是当今所有 Mac 启动磁盘使用的格式,而在 APFS 上,一个“重复文件”往往根本不是重复的。当你在访达中选取文件 › 复制(Command-D),或者把文件拷贝到同一宗卷上的另一个文件夹时,macOS 通常会创建一个克隆:第二个文件指向与第一个文件相同的数据块。它几乎不占用额外空间,所以删除它也几乎拿不回任何空间。

APFS 克隆的工作原理

克隆是一个新文件,但它的内容没有被拷贝。两个文件都指向磁盘上相同的数据块。只有当其中一个被修改时,APFS 才会为修改的部分写入新的数据块,这种技术叫作写时拷贝(copy-on-write)。未修改的部分仍然共享。

完整拷贝会把每个数据块写两遍;克隆共享原文件的数据块;编辑之后,只有被修改的数据块是新的

macOS 会在以下情况下创建克隆:

  • 你在访达中于同一个 APFS 宗卷内使用“复制”或拷贝(按住 Option 键拖移)。
  • App 使用系统标准的文件拷贝调用来拷贝文件,很多 App 都是这样做的。
  • 你在“终端”中使用 cp -c。普通的 cp 会写入一份完整的副本。
cp -c "Big Video.mov" "Big Video copy.mov"   # 克隆:共享数据,几乎不占新空间
cp "Big Video.mov" "Big Video copy.mov"      # 完整拷贝:把所有数据重新写一遍

拷贝到另一个宗卷、外置驱动器或网络共享时,始终是完整拷贝。正如 Howard Oakley 所解释的,从“时间机器”备份中恢复克隆时,它们也会失去共享关系:每一个都会作为独立的文件恢复。

为什么删除克隆几乎不释放空间

只有当使用某个数据块的最后一个文件被删除,并且没有本地快照仍保留着它时,空间才会回来。对于一对克隆,删除其中一个后,所有共享的数据块仍被另一个使用,所以你只能拿回几 KB 的文件系统元数据。我们做过测试:克隆一个 200 MB 的文件,可用空间只减少了约 4 KB;普通拷贝则减少了 200 MB。

部分编辑过的克隆介于两者之间。如果你克隆了一个 10 GB 的视频,然后剪辑了其中一份,那么不同的数据块只属于其中一个文件;删除这个文件会释放这些数据块,仅此而已。

为什么重复文件查找工具会高估可节省的空间

重复文件查找工具比较的是文件内容,通常借助校验和。克隆的内容与原文件完全相同,因此会被报告为重复文件,它的完整大小也会被计入“可节省”的总数。在有很多克隆的 Mac 上,这个总数可能高出好几 GB。

同样的盲点也解释了为什么有些工具的结果互相矛盾。访达的“显示简介”和 du 会把每个文件的大小分别相加,所以一个包含三个 1 GB 文件克隆的文件夹看起来像是 3 GB。真正会变化的,是“磁盘工具”中显示的宗卷可用空间。

如果你确实有很多真正的副本,更好的做法往往是把它们转换成克隆而不是删除,这样每个路径都还能正常使用。John Siracusa 开发的 Hyperspace 等工具做的就是这件事。

逻辑大小与分配大小

每个文件都有两个大小:

  • 逻辑大小:文件包含多少字节。ls -l 和访达的“大小”显示的就是它。
  • 分配大小:文件实际占用多少磁盘空间。访达中的“磁盘上”数值和 du 显示的就是它。

对于克隆(共享数据块)、稀疏文件(例如磁盘映像和虚拟机,未写入的区域不占空间)、被 APFS 压缩的文件,以及已移除下载的云端文件,这两个大小会不一样。更多内容请参见逻辑大小与物理大小。

ls -lh "Big Video.mov"   # 逻辑大小
du -h "Big Video.mov"    # 分配大小,按没有任何共享来计算

如何安全地找到真正的重复文件

从大文件入手。小的重复文件很少值得在意。在访达中选取文件 › 新建智能文件夹,点按 +,设置文件大小 › 大于 › 500 MB(如果第一个菜单中没有“文件大小”,请选取“其他…”),然后切换到列表视图并按名称排序。名称和大小相同的文件就是候选项。

用校验和确认。shasum 是 macOS 自带的工具,只会读取文件:

shasum -a 256 ~/Movies/"Trip.mov" ~/Desktop/"Trip copy.mov"

如果两串很长的十六进制字符相同,内容就完全相同。要检查整个文件夹里的大文件是否有相同的:

find ~/Movies -type f -size +100M -print0 | xargs -0 shasum -a 256 \
  | awk '{n[$1]++; l[$1]=l[$1] $0 "\n"} END {for (h in n) if (n[h]>1) print l[h]}'

这会按校验和分组,列出相同的文件。它不会删除任何东西。校验和相同并不能说明这些文件是否为克隆,所以请把这部分空间视为“可能可以回收”。

如果你愿意,也可以使用口碑好的工具。开源的 dupeGuru 和知名的商业 App 都可以,前提是你逐组检查,排除资料库和系统文件夹,并把它们给出的可节省空间当作上限来看待。

处理重复文件的安全流程:确认内容相同,检查是否位于资料库或 App 内,保留被引用的那一份,然后对比可用空间

删错副本的风险

内容相同并不意味着两份副本可以互换。

  • “照片”图库。切勿在访达中删除 .photoslibrary 包内的文件;图库的数据库仍然需要它们,删除可能导致图库损坏。从 macOS Ventura 起,“照片”的“实用工具”下有一个“重复项”相簿,可以正确地合并重复项。删除的项目会先进入“最近删除”。
  • “音乐”、Final Cut Pro、Lightroom 等资料库按路径引用文件。删掉资料库指向的那份“重复文件”,就会留下一个丢失的文件。
  • App 包。很多 App 内含相同的框架。删除 .app 中的任何内容都会破坏它的代码签名,可能导致它无法打开。请改为卸载整个 App;参见如何彻底卸载 Mac App。
  • 项目和代码。项目文件夹中的文件会被构建和脚本引用;桌面上的那份副本通常才是应该移除的。
  • 备份。特意存放在另一个驱动器上的第二份副本是备份,不是重复文件。

拿不准时,保留位于 App 预期位置的那一份,把另一份移到废纸篓,这样还能放回原处。

MoreRoom 能帮上什么忙

MoreRoom 的免删除释放可以免费找出 1 MB 或以上的相同文件。使用 Pro 时,它会把多余的副本转换为 APFS 克隆,就像访达的“复制”一样:每个副本都留在原处,保留各自的名称、日期和标签,但数据只存储一份,也不会删除任何内容。每个文件在操作前都会再次检查;之后如果编辑了某个副本,它只会重新获得自己独立的空间。MoreRoom 还会如实地测量你的磁盘:扫描时,克隆的数据只计算一次,所以它的统计和矩形树图不会像逐个文件相加那样因克隆而虚高。它的规则还会标出可以检查的常见副本,比如留在“下载”文件夹中的旧磁盘映像。你移除的任何内容都会先移到废纸篓,并且可以撤销。对于“照片”中的重复项,请使用“照片”自带的“重复项”相簿。

常见问题

在访达中复制文件会让占用的空间翻倍吗?

在 APFS 上不会。访达的“复制”(Command-D)以及在同一 APFS 宗卷内的拷贝会创建共享同一数据的克隆,因此在其中一份被编辑之前,副本几乎不额外占用空间。

怎样判断一个文件是不是克隆?

访达不会显示这一点,两份副本都会显示完整大小。实用的检验方法是:记下可用空间,删除其中一份,清倒废纸篓,看看可用空间是否增加。

为什么删除重复文件后空间没有释放?

这些文件很可能是共享同一数据的克隆或硬链接。只有当使用这些数据块的最后一个文件被删除后,空间才会回来。

使用重复文件查找工具安全吗?

口碑好的工具是安全的,前提是你逐一检查每组匹配结果。请排除“照片”和“音乐”资料库、App 包和系统文件夹,并记住它们估算的可节省空间可能把克隆也算了进去。

MoreRoom 能查找重复文件吗?

能,从 0.2.1 版开始。“免删除释放”可以免费找出 1 MB 或以上的相同文件;使用 Pro 时,它会把多余的副本转换为 APFS 克隆,每个文件都留在原处,但数据只存储一份。不会删除任何内容。

本指南提到的文件夹