所有文章

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

· 阅读约 7 分钟

访达无法比较两个文件夹。把一个文件夹拷贝到外置磁盘、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 之后:

  1. 从 Xcode 的菜单 Xcode › Open Developer Tool › FileMerge 打开它(Xcode 只有英文界面),或者在“终端”里输入 opendiff,后面跟上两个文件夹。
  2. 选择左边和右边的文件夹,然后点按 Compare。

FileMerge 会列出两个文件夹中的文件:相同的文件显示为灰色,不同的或只在一边的文件显示为黑色。连按某个文件,可以逐行查看它的两个版本。它是为源代码设计的:文本文件能准确显示改动,照片、视频或 PDF 则只能告诉你它们不同。

在 Folia Files 中比较两个文件夹

Folia Files 提供比较工具:结果以可排序的表格呈现,缺少的文件可以朝任一方向拷贝。官网版和 Mac App Store 版都有这个工具。

  1. 在两个并排的面板中分别打开这两个文件夹(参见在 Mac 上并排显示两个文件夹)。这一步可以省略,但比较工具会默认使用前两个面板的文件夹。
  2. 选取工具 › 比较…(⇧⌘K),或点按工具栏中的工具,再点按比较。工具会在一个标签页中打开。
  3. 确认左和右两个文件夹。点按选取…可以换一个文件夹;两者之间的箭头可以互换左右。
  4. 点按比较。

在标签页中打开的 Folia Files 比较工具:左边是“图片”中的“冰岛 2026”文件夹,右边是它在 pCloud 中的副本;6 个文件不同,8 个仅左侧,3 个仅右侧,并显示两边各自的大小和日期

每个文件都会被标记为以下四种状态之一:

  • 不同:两个文件夹里都有,但不一样;
  • 仅左侧和仅右侧:另一个文件夹里没有;
  • 相同:两边完全一样。

列表上方的按钮显示每种状态的文件数,并可用来筛选列表。相同的文件一开始是隐藏的,所以你看到的正是需要处理的部分;点按相同可以把它们也显示出来。左、修改日期(左)、右和修改日期(右)几列给出两边各自的大小和日期,一眼就能看出哪份副本更新。

比较工具的上半部分:两个文件夹、“比较内容”和“隐藏文件”两个选项,以及带数量的四个状态按钮

快速还是精确

默认情况下,Folia Files 不读取文件内容:大小相同、修改日期相同(误差两秒以内)的两个文件即视为相同。即使有成千上万张照片,也很快就能比较完。

如果日期不可靠,请打开比较内容(较慢,但精确)。没有保留原始日期的副本(例如用不带 -p 的 cp 拷贝的,或从云盘网页重新下载的)会让每个文件都显示为不同。打开这个选项后,大小相同的文件会按 SHA-256 指纹比较,日期则被忽略。大小不同的文件始终是不同。

另外几条规则:

  • 两边都有的子文件夹本身不会单独成行,但其中的文件会列出,并带有它们在文件夹中的路径。
  • 只在一边存在的文件夹只显示一行,标为文件夹,不列出其内容。
  • 除非勾选隐藏文件,否则隐藏文件不参与比较;访达的 .DS_Store 文件始终被忽略。
  • 文件按路径配对。在其中一个文件夹里改过名的文件会出现两次:一个名字下是仅左侧,另一个名字下是仅右侧。

拷贝缺少的文件

选中若干行(按住 ⌘ 或 ⇧ 点按可多选),再点按工具底部的将所选内容拷贝到右侧 →或← 到左侧。右键菜单里也有同样的命令(拷贝到右侧 →、← 拷贝到左侧),旁边还有在 Folia Files 中显示左侧文件和在 Folia Files 中显示右侧文件,可以在当前面板中定位到该文件。

  • 缺少的子文件夹会在另一边自动创建。
  • 如果目标位置已经有这个文件(即不同的文件),Folia Files 会询问如何处理。默认是两者都保留;如果较新只在拷贝的文件更新时才替换;替换会在新文件完全拷贝好之后,把旧版本移到废纸篓;跳过则不做任何改动。
  • 拷贝完成后,比较会自动重新运行。拷贝的文件会保留原来的修改日期,因此通常会变成相同并从列表中消失。这些拷贝和其他拷贝一样,会记录在操作历史中。

查看文件内部改了什么

连按一个不同的文件,或者右键点按它并选择显示差异。工具会切换到文件视图,把文本文件的两个版本逐行并排显示:删除的行标红,新增的行标绿,并给出新增和删除的行数。对于照片、PDF 等其他文件,它会显示两者是否相同以及各自的大小。

该选哪一种

  • 熟悉“终端”、想快速而精确地检查:diff -rq。
  • 比较代码或文本文件的两个版本,且装有 Xcode:FileMerge。
  • 确认一份拷贝或备份是否完整并当场补齐,尤其是照片和文档:Folia Files 的比较工具。

如果你每周都在手动拷贝同样的差异,不如交给同步来做:参见如何在 Mac 上让两个文件夹保持同步。至于以后的拷贝,Folia Files 还可以在拷贝时逐个验证文件:打开设置 › 文件与网络 › 验证拷贝到其他磁盘的每个文件(回读并比较,速度较慢)即可。