如何在 Mac 上比较两个文件夹并找出差异

访达无法比较两个文件夹。把一个文件夹拷贝到外置磁盘、NAS 或云盘后,想确认副本是否完整;或者手上有一个项目的两个版本,想看看改了什么——在 Mac 上有三种办法:“终端”里的 diff 命令、Apple 的 FileMerge 应用(随 Xcode 提供),或者带比较工具的文件管理器,比如 Folia Files。三种办法都能列出只在一个文件夹里的文件,以及两边都有但内容不同的文件。
为什么访达告诉不了你
访达能做到的最接近的一步,是对每个文件夹使用显示简介(⌘I),查看大小和项目数。数字一致,说明两个文件夹多半相同,但并不能证明:文件内容变了,大小却可能不变,比如文本文件里改正了一个字母。数字不一致,它也不会告诉你缺了哪些文件。剩下的办法只有把两个文件夹并排打开,逐个核对文件名。
在“终端”中用 diff 比较两个文件夹
macOS 自带 diff 命令,加上两个选项就能比较整个文件夹:
diff -rq ~/Pictures/Iceland /Volumes/Backup/Iceland
-r 会进入每个子文件夹,-q 只报告哪些文件不同,而不显示每个文件内部改了什么。不想输入路径的话,先输入 diff -rq ,再把两个文件夹依次从访达拖到“终端”窗口里。
输出只有两种行:
Files /Users/alex/Pictures/Iceland/IMG_4021.jpg and /Volumes/Backup/Iceland/IMG_4021.jpg differ
Only in /Users/alex/Pictures/Iceland: IMG_4048.jpg
Only in 表示某个文件或文件夹只存在于一边(如果是文件夹,不会列出其中的内容)。Files … differ 表示两边都有这个文件,名称和路径相同,但内容不同。如果 diff 什么都没输出,说明两个文件夹里的文件和内容完全一致。
需要注意几点:
diff会读取文件来比较,所以结果精确(与日期无关),但面对庞大的照片或视频库、或网络驱动器上的文件夹时会很慢。- 访达生成的隐藏文件
.DS_Store在两份副本之间往往不同,可以用-x .DS_Store排除。 - 如果只想核对文件名而不读取任何文件(即使磁盘很慢也很快),可以比较两份文件列表:
diff <(cd ~/Pictures/Iceland && find . | sort) <(cd /Volumes/Backup/Iceland && find . | sort)
以 < 开头的行只存在于第一个文件夹,以 > 开头的行只存在于第二个文件夹。
用 FileMerge 比较文件夹
FileMerge 是 Apple 自家的比较应用。它是免费的,但随 Xcode(Apple 的开发者工具)一起提供,需要从 Mac App Store 下载一个很大的安装包;体积较小的 Command Line Tools 不包含它。装好 Xcode 之后:
- 从 Xcode 的菜单 Xcode › Open Developer Tool › FileMerge 打开它(Xcode 只有英文界面),或者在“终端”里输入
opendiff,后面跟上两个文件夹。 - 选择左边和右边的文件夹,然后点按 Compare。
FileMerge 会列出两个文件夹中的文件:相同的文件显示为灰色,不同的或只在一边的文件显示为黑色。连按某个文件,可以逐行查看它的两个版本。它是为源代码设计的:文本文件能准确显示改动,照片、视频或 PDF 则只能告诉你它们不同。
在 Folia Files 中比较两个文件夹
Folia Files 提供比较工具:结果以可排序的表格呈现,缺少的文件可以朝任一方向拷贝。官网版和 Mac App Store 版都有这个工具。
- 在两个并排的面板中分别打开这两个文件夹(参见在 Mac 上并排显示两个文件夹)。这一步可以省略,但比较工具会默认使用前两个面板的文件夹。
- 选取工具 › 比较…(⇧⌘K),或点按工具栏中的工具,再点按比较。工具会在一个标签页中打开。
- 确认左和右两个文件夹。点按选取…可以换一个文件夹;两者之间的箭头可以互换左右。
- 点按比较。

每个文件都会被标记为以下四种状态之一:
- 不同:两个文件夹里都有,但不一样;
- 仅左侧和仅右侧:另一个文件夹里没有;
- 相同:两边完全一样。
列表上方的按钮显示每种状态的文件数,并可用来筛选列表。相同的文件一开始是隐藏的,所以你看到的正是需要处理的部分;点按相同可以把它们也显示出来。左、修改日期(左)、右和修改日期(右)几列给出两边各自的大小和日期,一眼就能看出哪份副本更新。

快速还是精确
默认情况下,Folia Files 不读取文件内容:大小相同、修改日期相同(误差两秒以内)的两个文件即视为相同。即使有成千上万张照片,也很快就能比较完。
如果日期不可靠,请打开比较内容(较慢,但精确)。没有保留原始日期的副本(例如用不带 -p 的 cp 拷贝的,或从云盘网页重新下载的)会让每个文件都显示为不同。打开这个选项后,大小相同的文件会按 SHA-256 指纹比较,日期则被忽略。大小不同的文件始终是不同。
另外几条规则:
- 两边都有的子文件夹本身不会单独成行,但其中的文件会列出,并带有它们在文件夹中的路径。
- 只在一边存在的文件夹只显示一行,标为文件夹,不列出其内容。
- 除非勾选隐藏文件,否则隐藏文件不参与比较;访达的
.DS_Store文件始终被忽略。 - 文件按路径配对。在其中一个文件夹里改过名的文件会出现两次:一个名字下是仅左侧,另一个名字下是仅右侧。
拷贝缺少的文件
选中若干行(按住 ⌘ 或 ⇧ 点按可多选),再点按工具底部的将所选内容拷贝到右侧 →或← 到左侧。右键菜单里也有同样的命令(拷贝到右侧 →、← 拷贝到左侧),旁边还有在 Folia Files 中显示左侧文件和在 Folia Files 中显示右侧文件,可以在当前面板中定位到该文件。
- 缺少的子文件夹会在另一边自动创建。
- 如果目标位置已经有这个文件(即不同的文件),Folia Files 会询问如何处理。默认是两者都保留;如果较新只在拷贝的文件更新时才替换;替换会在新文件完全拷贝好之后,把旧版本移到废纸篓;跳过则不做任何改动。
- 拷贝完成后,比较会自动重新运行。拷贝的文件会保留原来的修改日期,因此通常会变成相同并从列表中消失。这些拷贝和其他拷贝一样,会记录在操作历史中。
查看文件内部改了什么
连按一个不同的文件,或者右键点按它并选择显示差异。工具会切换到文件视图,把文本文件的两个版本逐行并排显示:删除的行标红,新增的行标绿,并给出新增和删除的行数。对于照片、PDF 等其他文件,它会显示两者是否相同以及各自的大小。
该选哪一种
- 熟悉“终端”、想快速而精确地检查:
diff -rq。 - 比较代码或文本文件的两个版本,且装有 Xcode:FileMerge。
- 确认一份拷贝或备份是否完整并当场补齐,尤其是照片和文档:Folia Files 的比较工具。
如果你每周都在手动拷贝同样的差异,不如交给同步来做:参见如何在 Mac 上让两个文件夹保持同步。至于以后的拷贝,Folia Files 还可以在拷贝时逐个验证文件:打开设置 › 文件与网络 › 验证拷贝到其他磁盘的每个文件(回读并比较,速度较慢)即可。


