Windows中与diff命令相当的命令是什么?

359

我知道有一篇类似的文章:这里
我尝试使用它提到的comp命令,但是如果我有两个文件,一个数据为“abcd”,另一个数据为“abcde”,它只会说文件大小不同。我想知道它们具体在哪里不同。在Unix中,简单的diff命令告诉我它们不同的行和列,在Windows中的comp命令适用于像“abd”和“abc”这样的文件,而其他情况则不适用。请问我可以用什么方法解决这个问题?

13个回答

561

在CMD shell或批处理文件中运行此命令:

FC file1 file2

FC 也可以用于比较二进制文件:

FC /B file1 file2

3
如何处理两个文件夹中所有更改过的文件?比如,我将folder1的内容与folder2的内容进行比较:是否会显示folder2中更改过的行? - Wolfpack'08
22
@Wolfpack'08": FC path1\* FC path2\* 会比较路径 path1path2 中所有文件,前提是这些文件的名称完全相同。如果有文件名称不匹配,FC 将报告缺少的文件,但仅对于第一个文件夹中在第二个文件夹中找不到的文件,而不是反过来的情况。为了捕捉所有不匹配的文件,可能需要使用不同的技术。 - Andriy M
@AndriyM 那么,新文件会导致 FC 出错,而不返回任何实际行吗?只有错误消息? - Wolfpack'08
1
@Wolfpack'08:是的,只有关于缺失对应项的消息,没有现有方的任何行。(但如果您是在问其他现有文件对和它们的比较是否仍将进行,则不会终止其他现有文件对的处理和比较。) - Andriy M
1
@Cheetaiean:你有几个选项。 (1) 你可以增加命令提示符的屏幕缓冲区高度以适应整个输出。(2) 你可以将输出重定向到文件(FC ...your params... >filename),然后使用例如记事本(任何纯文本编辑器都可以)打开它。(3) 你可以将输出管道传输到MORE(FC ...your params... | MORE),然后逐页或逐行查看输出。你也可以尝试将此作为问题提交(不确定这里是否合适,也许[su]更合适),看看是否有更好的替代方案。 - Andriy M
显示剩余7条评论

40

嗯,在Windows上,我很愉快地运行diff和许多其他GNU工具。你可以使用cygwin来运行它,但我个人更喜欢GnuWin32,因为它的安装过程更加轻便。

所以,我的答案是,Windows平台的diff等价于diff本身!


1
Cygwin的基本安装似乎没有包含diff。我需要安装哪些附加软件包才能获取它? - Warren Dew
11
我不推荐使用Cygwin。我会使用本地的Win32版本的diff。 - David Heffernan
1
@WarrenDew 你需要的Cygwin软件包是diffutils。请参见https://cygwin.com/cgi-bin2/package-cat.cgi?file=x86_64%2Fdiffutils%2Fdiffutils-3.3-2&grep=diff - Steve Pitchers
2
现在有了Windows子系统Linux(WSL,也称为Windows上的Bash),如果在Windows 10上使用diff,就更容易获取和使用了。 - Zim

29

另一种选择是在这里下载并安装Git。然后您有两个选择:

选项1(首选)

使用Git Bash(从上面安装)中的diff,并像在Windows上使用本地*nix用户一样愉快地进行差异比较。

选项2

Git\bin\路径添加到您的PATH变量中。 这不仅会给您提供diff,还会提供许多其他可以从Windows命令行使用的Linux命令。

您可以通过右键单击计算机并选择属性来设置PATH变量。 然后,您可以在屏幕左侧单击高级系统设置。 在弹出窗口中,单击环境变量,然后使用Git\bin\在用户变量中添加或更新PATH变量。

Git diff文档


@firelight - 感谢您的回答。您能详细说明一下您在这里所说的意思吗:"然后,将Git\bin\路径添加到您的PATH变量中。" - BenKoshy
2
@BKSpurgeon - 如果您右键单击计算机并选择属性,然后可以在屏幕左侧单击高级系统设置。在弹出窗口中,单击环境变量,然后在用户变量中添加或更新PATH变量为Git\bin\。 - Tim Hutchison
@JustinCormack你有这方面的任何参考资料吗?我刚在Git Bash中尝试了diff并且它有效。 - Tim Hutchison
3
从你的回答中,@Tim Hutchison:“这不仅会给你diff,还会给你许多其他Linux命令,你可以从Windows命令行中使用。” - 你指的是哪些命令?当一个人安装Git时,他/她应该只需要在PATH中可用的git...可执行文件。此外,答案可能应该包括一个重要的信息:你需要通过编写“git diff”而不是“diff”来启动diff工具。 - Petr Bodnár
老兄,那完全是另一个“diff”。 - vintprox

29

Winmerge有一个命令行工具,值得一试。

此外,你也可以根据需要使用其图形界面部分。


3
虽然这不是 Windows 内置的实用工具,但我强烈推荐它——它是开源的、轻量级的,并且在我的使用经验中没有漏洞。 - david.barkhuizen

17

在我的情况下,FC的工作非常出色,但它对我没有帮助,因为我只想要那些已更改的行。而FC会提供其他数据,例如文件名、相同的行和双向比较。

    >fc data.txt data.txt.bak   
    ***** DATA.TXT
    ####09
    ####09
    ####09
    ***** DATA.TXT.BAK
    ####09
    ####08
    ####09

但在我的情况下,我只想要已更改的行,并希望将这些行导出到不带任何其他标题或数据的不同文件中。所以我使用了 "findstr" 来比较文件:

findstr /V /G:data.txt.bak data.txt >DiffResult.txt

其中:

data.txt.bak是旧文件的名称

data.txt是新文件的名称

DiffResult.txt包含更改的数据,即仅有一行 ####09。


1
/A 仅显示修改的代码块的第一行和最后一行 /N 显示行号 - Lukas

15

还有PowerShell(它是Windows的一部分)。 它不是很快,但很灵活,这是基本命令。 如果需要更好的格式化,人们已经为其编写了各种cmdlet和脚本。

PS C:\Users\Troll> Compare-Object (gc $file1) (gc $file2)

虽然不是 Windows 的一部分,但如果您是拥有 Visual Studio 的开发人员,它会带有 WinDiff(图形化界面)。

但我个人最喜欢的是 BeyondCompare,它需要花费30美元。


10

fc。fc 比 Cygwin 的 diff 更适合处理大文件(> 4 GBytes)。


4

如果您使用 COMP 工具时出现错误,那么很可能是因为该工具默认假定您要比较的文件大小相同。为了解决这个问题,您可以使用 '/n' 选项来指定要比较的行数。您可以在命令行中键入 'comp /?' 来查看 COMP 支持的选项。

因此,您的命令应该如下所示:

C:\>comp "filepath1" "filepath2" /a /l /n=(the number of lines you want to compare) /c 

如果您想继续使用COMP,那么这应该可以解决您的问题。但对于非常大的文件,这将成为一个问题。
虽然“comp”是一种选择,但我认为它很原始,“FC”是更好的选择。如果您需要经常使用文件比较实用程序,则可以同时使用“FORFILES”和“FC”来创建一个非常好的工具。
以下是使用FC的示例参考:
C:\>fc /c(case insensistive) /lbn(number of errors allowed before you wanna stop compare) /n(display line number) "filename1" "filename2"

有很多选项可供选择,您可以通过'fc /?'查看。

希望这可以帮到您。

4

DiffUtils可能是你最好的选择。它是diff在Windows下的等价物。

据我所知,没有内置的等价物。


我也曾使用过那个,但今天我发现该页面提供的旧版本2.8.7存在一个错误(当比较某些PDF文件时,它们会被报告为相等)。所以现在我更喜欢像firelight建议的那样使用“git diff”。 - anre

3

谢谢!在概览中,我必须点击文件名才能显示详细的差异。它显示了一个统一的视图,而不提供两个比较文件的并排视图。这使得很难将哪个版本与哪个文件关联起来。 - klaus thorn

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