在Windows中比较两个目录

59

我需要比较两个文件夹“A”和“B”,并获取新增或修改的文件和文件夹列表。

我尝试使用Winmerge软件,但它没有比较内部文件夹中存在的文件(因此我必须手动指向每个内部文件夹并进行比较)。

有什么方法可以实现这一点。


4
需要在WinMerge软件中启用“递归”复选框来实现此操作。 - user2369634
我有同样的问题/需求。我发现WinDiff工具非常有帮助。它有一个图形用户界面,您可以选择2个目录,然后可以保存不同的文件列表(或仅存在于两个目录中的其中一个)。 - Max
6个回答

54
以下 PowerShell 代码比较两个文件夹的文件列表。它可以检测重命名或新创建的文件和文件夹,但无法检测修改过的数据或不同的时间戳:
$dir1 = Get-ChildItem -Recurse -path C:\dir1
$dir2 = Get-ChildItem -Recurse -path C:\dir2
Compare-Object -ReferenceObject $dir1 -DifferenceObject $dir2

来源:微软开发博客 - Dr. Scripto

第三方编辑

如何运行 PowerShell 脚本 解释了如何在脚本中运行上面的代码。


1
如果您能解释一下命令的不同组成部分是做什么用的,那将非常有用。 - kojow7
4
Compare-Object是PowerShell中的通用对象比较函数。@kirill非常聪明地使用它,通过提供两个路径数组来使用它,每个数组都是使用Get-ChildItem获取的。将-Force添加到Get-ChildItem以包含隐藏的文件系统条目。 - Tomáš Hübelbauer
无论嵌套有多深,这都是有效的。 - puerile
2
这对我没用。在两个具有完全不同内容的相同名称文本文件的目录中,没有输出,而kdiff3正确地报告了非常明显的区别。 - MiloDC
3
@MiloDC 这比较的是文件列表,而不是文件内容... - kwitee
不幸的是,根据我的经验,这需要消耗大量的处理资源,而且在5分钟后什么也没有得到。使用robocopy/L,正如@dansmith65所提到的,可以立即产生结果。我比较了两个60Gb的目录。 - marckassay

43
对于Windows系统,您可以使用此解决方案
以下是正确的比较方式,无需外部下载。一开始看起来很多步骤,但一旦你做完了,就会变得非常容易。该方法适用于所有Windows版本,从7到95。在我们的示例中,假设您要比较名为“ A”和“ B”的两个目录。
  1. 运行cmd.exe以获取命令提示符。(在Windows 7中,PowerShell不起作用,请注意。) 然后再次运行它,这样您就会有两个相邻的窗口。
  2. 在每个窗口中,进入要比较的目录。(使用'cd'命令。如果您不熟悉此操作,则应该选择外部实用程序,除非您想学习命令提示符操作。)
  3. 在一个窗口中键入'dir /b> A.txt',在另一个窗口中键入'dir /b> B.txt'。现在您将拥有两个文本文件,列出了每个目录的内容。/ b标志表示精简,可以将目录清单剥离为仅包含文件名的形式。
  4. 将B.txt移动到与A.txt相同的文件夹中。
  5. 键入'fc A.txt B.txt'。命令'fc'表示文件比较。这将输出两个文件之间的差异列表,并在每个差异上方和下方添加额外的文本行,以便您知道它们的位置。有关如何格式化输出的更多选项,请在提示符处键入“fc /?”。您还可以通过使用类似于'fc A.txt B.txt> differences.txt'的内容将差异输入到另一个文件中。
祝愉快。

4
WinMerge对比目录输出的文本文件很有帮助。我使用了/s来递归子目录,并省略了/b,这样可以比较文件的时间和日期。(当然,每个"Directory of"行都是不匹配的,因为目录名不同。) - Bob Stein
2
WinMerge在GUI中本地支持目录比较,据我所知,无需使用/s或/b。在GUI中它对我非常有效。 (@BobStein感谢您发布WinMerge-这是Windows用户的绝佳解决方案!) - Tom
不需要WinMerge,dir /s /b > out.txt 正好做到了我想要的。 - roman m

17

这不一定比已经提到的其他选项更好,但它可能更适合某些用例。在我的情况下,我想看看有什么不同,然后再从一个目录复制这些差异到另一个目录。由于 /L 选项只记录会发生什么,所以这种方法非常适合这种情况。

robocopy C:\dir1 C:\dir2 /MIR /FP /NDL /NP /L

你可以使用其他标志进一步完善输出格式,或更改用于比较的逻辑等。有关所有选项,请参阅robocopy文档


2
添加 /XO /XN 以忽略旧文件/新文件。 如果需要列出目录中的差异(即使是空目录),请删除 /NDL - Vasiliy Zverev
1
在我看来,这比其他选项更好 - 输出更易于使用 - 选项更加多样化。感谢Vasiliy提供的额外开关。我还建议使用/xf <extension>来排除非必要的文件,例如.ini和thumbs.db。例如:/xf *.db /xf *.ini - Mike Bain
我已经使用Robocopy很多年了,从来没有想过在运行时使用它来比较文件。不幸的是,它没有显示出两个文件夹之间的任何差异,所以我又回到了原点。 - Wayne Barron
这是最好、最干净的答案!非常感谢! - Prabath

9

我们多年来一直在使用 Beyond Compare,它非常有用。您可以看到哪些文件是相同的,哪些文件只在文件夹“ A”中,哪些文件只在文件夹“ B”中以及不同的文件(对于这些文件,您可以查看所做的特定修改)。


2
BeyondCompare是一款出色的跨平台工具,价格合理,并且可以与许多IDE集成。我的跨平台许可证可以在Windows、Linux和MacOS系统之间进行移植 - 只要我同时使用一个实例即可。这是一款杰出的产品,Scooter Software是一家伟大的公司。我与其没有任何关系,只是自2000年以来一位快乐的用户。 - ScottWelker

3
几年前,我制作了一个命令行实用程序CrcCheckCopy,帮助我验证大型数据副本的完整性。它读取源文件夹并生成所有文件的CRC列表。然后,使用此列表,它可以验证另一个文件夹。
我还在几年后使用它来验证同一文件夹,以确保没有意外删除或修改。
我免费提供它这里,以防到达此问题的人想要尝试它。

1

1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - Ankur Lahiry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接