DIFF实用程序适用于2个文件。如何一次比较两个以上的文件?


84

因此,实用程序Diff的工作方式与我想要的2个文件一样,但是我有一个项目需要一次与两个以上的文件进行比较,一次最多可以进行10个文件的比较。这要求所有这些文件也彼此并排。我的研究并没有真正发现任何东西,vimdiff似乎是迄今为止最好的一次,可以一次比较4个。

我的问题:是否有任何实用程序可以一次比较两个以上的文件,或者可以通过一种方法来比较diff / vimdiff以便进行多个比较?我要比较的文件相对较短,因此应该不会太慢。

提前致谢!

Answers:


111

使用Diffuse可以轻松并排显示10个文件并突出显示差异。只需在命令行上指定所有文件,如下所示:

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


1
哇,太棒了!感谢您的答复,甚至很晚,我仍然需要帮助。
Javed Ahamed

1
这种比较叫什么?
leeand00 2010年

4
很棒的工具;只是帮助我解决了一个棘手的问题。我知道这是一个较旧的答案,但谢谢!
SeanKilleen

谢谢你一千次!帮助找出一堆复制粘贴文件中的细微差别有很大帮助。
Trass3r

1
@Gruber-我必须在不好的时候点击链接-我删除了我的评论
fightc2

28

Vim已经可以做到这一点:

vim -d file1 file2 file3

但是通常您只能使用4个文件。您可以通过修改Vim源代码中的一行来更改它。该常数DB_COUNT定义了差异文件的最大数量,它diff.c在版本6.x和更早版本的顶部定义,或者structs.h在版本7.0及更高版本中的大约三分之二处定义。


vimdiff或vim -d至少一次只能在我的计算机上执行4个文件。有人知道如何绕过这个吗?
贾维德·阿哈默德

我没有在问题中提到这一点。更新以包含有关更改Vim限制的说明。
Noah Medling,2009年

嘿,您知道如何真正到达structs.h或diff.c吗?我在Win或Linux上找不到vim源代码。
贾维德·阿哈默德

vim似乎不能够对两个以上的目录进行目录比较,这限制了其实用性。另一个限制是,将文件相互比较时,您只能看到文件的左侧,没有滚动条可以看到所有内容。而且没有GUI方法来回推送更改。
Jereme Guenther

7

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.

希望我可以将其与进程替换而不是真实文件路径一起使用。
Jan Kyu Peblik

1
@JanKyuPeblik如果您使用的zsh,请查看=(...)的输出写入到一个临时文件,并扩展到临时文件的名称进程替换的形式zsh.sourceforge.net/Doc/Release/...
埃里克释放

2

结帐“超越比较”:http : //www.scootersoftware.com/

它使您可以比较文件的整个目录,看起来它也可以在Linux上运行。


1
diff -r还比较文件的整个目录,但只比较一个目录中的文件与另一目录中的文件进行比较
reinierpost 2010年

6
“超越比较”是一个出色的工具,我一直使用它来解决合并冲突。但是,它不是此工作的正确工具,因为它只能将两个文件相互比较或与一个共同祖先进行比较。
Superole

抱歉,-1,但这是关于将多个文件进行相互比较。
Manohar Reddy Poreddy

1

如果您基于一个文件运行多个差异文件,则可以尝试编写一个包含for循环的脚本,以遍历每个目录并运行差异文件。尽管不会并排,但您至少可以快速比较它们。希望能有所帮助。


是的,但是如果我要比较例如3个文件,我希望它们对其他2个文件进行比较,因为diff会进行重新排列以查看它们的匹配位置。
Javed Ahamed

我发现此命令可能对您的脚本有帮助,该命令称为diff3,并且可能是比较三个文件的实用程序。 linux.about.com/library/cmd/blcmdl1_diff3.htm Windows版本可以在这里找到gnuwin32.sourceforge.net/packages/diffutils.htm
本杰明·尼尔

0

没有回答主要问题,但这类似于本杰明·尼尔(Benjamin Neil)提出的建议,只是区别了所有文件:

将文件名存储在数组中,然后遍历2号和diff的组合(或执行任何您想做的事情)。

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


0

有一个简单的好方法来做到这一点= GREP。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.