DIFF实用程序适用于2个文件。如何一次比较多于2个文件?

111

因此,针对两个文件,实用程序Diff的工作方式就像我想要的那样,但我有一个需要同时比较多个文件的项目,可能最多达到10个。这需要将所有这些文件彼此并排放置。我的研究并没有真正发现什么,vimdiff似乎是目前最好的,它可以同时比较4个文件。

我的问题是:是否有任何实用程序可以比较多于2个文件,或者有一种方式可以对Diff / vimdiff进行修改,使其可以进行多个比较? 我将要比较的文件相对较短,因此速度不应该太慢。

7个回答

122

使用Diffuse可以轻松地将10个文件并排显示并突出显示差异。只需像这样在命令行中指定所有文件:

diffuse 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt 10.txt


1
哇,这太棒了!感谢您的回复,即使很晚,我仍然需要帮助。 - Javed Ahamed
2
这种比较被称为什么? - leeand00
4
太棒了!这个工具刚好帮我解决了一个令人头疼的问题。我知道这是一个较旧的答案,但还是非常感谢! - SeanKilleen
1
这是一个纯图形界面工具吗?/usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:57: GtkWarning: could not open display - rogerdpack
1
@leeand00 [k-way merging/diffing](https://en.wikipedia.org/wiki/K-way_merge_algorithm) - Sam
显示剩余9条评论

41

Vim 已经可以做到这一点:

vim -d file1 file2 file3

但是通常情况下,你只能同时编辑4个文件。不过,你可以通过修改Vim源代码中的一行来改变这个限制。常量DB_COUNT定义了最大的差异文件数,在6.x版本及更早版本中,它被定义在diff.c文件的顶部左右;而在7.0及更高版本中,它被定义在structs.h文件的大约2/3处。


vimdiff或vim -d我电脑上一次只能处理4个文件。有人知道如何绕过这个限制吗? - Javed Ahamed
我没有注意到问题中提到了那个。已更新,包括更改Vim限制的说明。 - Noah Medling
嘿,你知道如何实际进入structs.h或diff.c吗?我在Win或Linux上找不到vim源代码。 - Javed Ahamed
vim似乎无法对两个以上的目录进行比较,这限制了它的实用性。另一个限制是,在文件相互比较时,您只能看到文件的左侧,没有滚动条可以查看全部内容。而且,没有GUI方法来推送更改。 - Jereme
我已经在不同目录下使用了这个工具来比较5个文件,但是如何退出比较模式呢? - Prasanta Bandyopadhyay
我发现这不仅限于4个文件。(不修改源代码的情况下,我认为默认值现在是8个?)虽然一个一个地退出“:q”很烦人,但需要知道“:qa”才能退出所有文件。 - benjimin

19

diff内置选项--from-file--to-file,用于将一个操作数与所有其他操作数进行比较。

   --from-file=FILE1
          Compare FILE1 to all operands.  FILE1 can be a directory.

   --to-file=FILE2
          Compare all operands to FILE2.  FILE2 can be a directory.

注意:参数名称 --to-file 是可选的。 例如:

# this will compare foo with bar, then foo with baz .html files
$ diff  --from-file foo.html bar.html baz.html

# this will compare src/base-main.js with all .js files in git repo,
# that has 'main' in their filename or path
$ git ls-files :/*main*.js | xargs diff -u --from-file src/base-main.js

希望我能够使用进程替换而不是真实文件路径来使其工作。 - Jan Kyu Peblik
1
如果您使用zsh,请查看进程替换的=(...)形式,该形式将输出写入临时文件并扩展为该临时文件的名称。http://zsh.sourceforge.net/Doc/Release/Expansion.html#Process-Substitution - Eric Freese

1

1
diff -r 还可以比较整个文件目录,但它只会将一个目录中的文件与另一个目录中的文件进行比较。 - reinierpost
9
Beyond Compare 是一款非常棒的工具,我经常用它来解决合并冲突。然而,对于这项工作,它并不是最合适的工具,因为它只能将两个文件与彼此或与一个共同祖先进行比较。 - Superole
抱歉得分为-1,但这是关于将许多文件相互比较的问题。 - Manohar Reddy Poreddy

1
如果你正在运行基于一个文件的多个差异,你可以尝试编写一个脚本,其中包含一个for循环来遍历每个目录并运行差异。虽然它不会并排显示,但你至少可以快速比较它们。希望这有所帮助。

是的,但如果我要比较例如3个文件,我希望它们都与另外两个文件进行差异比较,因为Diff会重新排列以查看它们匹配在哪里。 - Javed Ahamed
我找到了一个可能有助于你的脚本的命令,它叫做diff3,据说它是一个比较三个文件的实用工具。http://linux.about.com/library/cmd/blcmdl1_diff3.htmWindows版本可以在这里找到 http://gnuwin32.sourceforge.net/packages/diffutils.htm - Benjamin Neil

1

虽然没有回答主要问题,但这里有一个类似于Benjamin Neil所建议的但是对所有文件进行差异比较的方法:

将文件名存储在数组中,然后循环遍历大小为二的组合并进行差异比较(或者进行任何你想要的操作)。

files=($(ls -d /path/of/files/some-prefix.*))     # Array of files to compare
max=${#files[@]}                                  # Take the length of that array
for ((idxA=0; idxA<max; idxA++)); do              # iterate idxA from 0 to length
  for ((idxB=idxA + 1; idxB<max; idxB++)); do     # iterate idxB + 1 from idxA to length
    echo "A: ${files[$idxA]}; B: ${files[$idxB]}" # Do whatever you're here for.
  done
done

源自@charles-duffy的回答:https://stackoverflow.com/a/46719215/1160428


max=${#files[@]} echo "from;to;cnt" > multi_diff_cnt.csv for ((idxA=0; idxA> multi_diff_cnt.csv done done``` 在这种情况下,对我很有效。 - Sanek Zhitnik

-2

有一种简单而好的方法可以做到这一点 = GREP。

根据文本的大小,您可以复制并粘贴它,或者您可以将文件输入重定向到grep命令。如果您进行grep -vir /path以进行反向搜索或grep -ir /path。这是我参加认证考试的方式。


4
grep 不是 diff;如何使用 grep 比较文件? - reinierpost

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