文件和目录比较工具?

我正在寻找一个类似于Beyond Compare的软件,可以比较目录和文件。
主要是用于源代码控制,但我也需要用它来进行部署。

你只想要文件列表还是每个文件的实际内容? - Martin Ueding
我想要文件列表,如果可能的话,还要同一个路径下不同文件之间的内容差异。 - isoman
2如果GUI工具允许隐藏相同的文件夹和文件,那将非常方便。这将使我们更容易集中注意力处理奇怪的文件夹和文件。有没有人知道支持此功能的工具? - JJD
请看一下unison。Beyond Compare采用“一站式服务”的方法,而unison专注于处理树遍历、保持状态和传播更改,通过将diff、三方合并等操作委托给您最喜欢的文件级别程序来覆盖Beyond Compare功能。Unison是免费、非常强大且成熟的软件,可以快速检测和同步庞大的树状结构,在不同操作系统之间进行网络同步等。请先阅读文档,特别是在Windows操作系统上。 - Stéphane Gourichon
Emacs有一个目录比较工具。就像所有的Emacs一样,它的外观很吸引人,嗯,“什么是外观吸引人?”但它可以显示带有键盘快捷键的上下文帮助,通过几个按键进行递归分析,隐藏相同的文件或子目录,交互式选择要显示的文件并使用各种选项显示颜色编码的差异,交互式合并、传播或对文件执行任意编辑操作,轻松跳转到下一个文件或目录,并跟踪状态,提供所有常用的编辑功能。 - Stéphane Gourichon
不熟悉Beyond Compare。在Windows上使用Total Commander来进行比较。它可以在Wine下运行,并且我在Mac上也是这样使用的。在Linux上,我使用Krusader,它具有与Total Commander类似的同步目录功能。或者使用Meld来处理主要是文本文件的目录树。 - mivk
20个回答

Meld安装 Meld

Meld 是一个能够比较和合并文件和目录的工具。它是标准的 diff 安装 diffutilspatch 安装 patch 命令行工具的图形界面类似物。(请参阅关于这两个工具的详细信息,man diffman patch

enter image description here

此外,许多源代码控制系统(例如bzr 安装bzr-gtkgit 安装git)都具备在不同版本之间创建差异的能力。

2Meld太棒了。我把它用作我的源代码控制差异比较工具。 - Matt Joiner
12刚刚尝试了一个更大的文件夹——4 GB,2000个文件。Meld的功能符合预期。但是对于这个文件夹,Meld非常缓慢,界面不响应(阻塞)。现在使用rsync。 - geekQ
1还可以很好地将文本文件进行并排比较,甚至可以复制粘贴内容。这是我见过的最好的界面! - Stefan Rogin
1@geekQ 作为一个快速的替代方案,能够即时处理任意大小的文件夹,请参考下面的beyond compare。在我看来,它比meld更优秀。 - phil294
1每次我想选择一个文件夹时,Meld都会崩溃 :/ 我在我的发行版存储库(Ubuntu 14.04)中有最新版本可用。 - Youda008

Diff是你的朋友。

diff -ur path1 path2

这将比较路径1和路径2之间所有共同的文件。
如果你将-ur改为-urN,那么它还会显示只存在于其中一个路径中的文件的内容。

2安装 colordiff 并使用 colordiff -ur path1 path2 - warvariuc
不适用于Cygwin。 - Tomáš Zato


Beyond Compare在进行ssh(使用密钥或密码)连接到远程主机并将其与本地副本进行比较时特别有用。 - brianlmerritt

使用diff命令:
diff -u file1 file2

diff -u 选择一个带有几行上下文的格式。一个简单的 diff file1 file2 只列出不同的行。还有许多其他选项来控制输出格式,忽略只有空格差异等。

如果你想将输出写入文件,请重定向它:

diff -u file1 file2 >file1-file2.diff

GNOME指挥官安装GNOME指挥官

界面可能不够时尚,但功能非常强大!

alt text

如果你习惯使用其他的*Commander(比如Norton或类似的软件),你不会感到迷失。

1我还没有用它来比较两个文件,但是我用它来告诉我哪些文件在比较目录时有所不同。这在整理照片时特别有用;-) - Huygens

命令行工具

受到这篇博客文章的启发。

diff

列出不同的文件:

diff -qr folder1 folder2

同时列出内容:

diff -Naur folder1 folder2

rsync

如果两个目录不在同一台机器上,rsync 可能是最简单的解决方案。通常情况下,rsync 用于同步目录,但你可以以详细和模拟模式运行它,这样它只会列出需要更改的文件。

rsync -rvnc --delete folder1 server:/path/to/folder2

如果你想根据时间戳和文件大小来比较文件以加快速度,你可以省略。
rsync -rvn --delete folder1 server:/path/to/folder2

KDiff3 安装KDiff3

这是一个为KDE用户提供的diff图形界面(或者如果您不介意使用Qt应用程序)。

kdiff3

还有一个dirdiff install dirdiff 用于比较目录。

Krusader安装Krusader

Krusader是一个免费工具(可在软件中心下载),它可以以对比的方式显示文件夹内容,并且您可以使用许多不同的选项进行同步。您可以在同步和比较时进行筛选。

Krusader

要比较文件内容,只需标记两个文件,选择“文件”>“比较内容”,它们将以逐字逐句的方式进行比较。Krusader默认使用的比较工具是默认的KDE工具“Kompare”。您可以设置Krusader使用任何其他比较工具,例如上述之一。
这是我找到的最完整的解决方案,非常方便。它还支持Midnight Commander(Norton Commander语法)使用的所有功能键绑定。

你也可以使用“工具->同步目录”来获取两个目录面板的递归文件变更视图。 - Angelos Pikoulas
很不幸,Krusader中的同步器没有得到维护:https://bugs.kde.org/show_bug.cgi?id=270150#c7。 有没有其他正在积极维护的替代方案? - rubo77
1@rubo77:这个 bug 已经在此期间被修复了。 - mivk

也许Meld是你正在寻找的东西。 或者这里还有一些其他选择。

我两周前了解到hashdeep。它有一些强大的优点:
  • 与meld相比,它适用于非常大的文件夹。当meld变得极慢且界面无响应(被阻塞)时,hashdeep以恒定的速度工作。
  • 与rsync相比,hashdeep可以检测移动的文件-具有相同内容但位于不同目录中的文件。
详细输出如下:
...
foo/bar.txt: Known file not used
x/foo/M0824_2L.JPG: Moved from y/P1010998.JPG

hashdeep: Audit failed
   Input files examined: 0
  Known files expecting: 0
          Files matched: 6233
Files partially matched: 0
            Files moved: 3695
        New files found: 19257
  Known files not found: 4713