如何在Linux上比较大文件


31

diff: memory exhausted尝试对两个27 GB的文件进行差异比较时出现错误,这些文件在具有CentOS 5和4 GB RAM的Linux机器上非常相似。看来这是一个已知的问题。

我希望可以为这种必要的实用程序提供替代方法,但我找不到。我想该解决方案将不得不使用临时文件而不是内存来存储所需的信息。

  • 我尝试使用rdiffxdelta,但是它们更适合显示两个文件之间的更改(例如补丁程序),而对于检查两个文件之间的差异不是那么有用。
  • 尝试使用VBinDiff,但它是一种可视化工具,可以更好地比较二进制文件。我需要一些可以像常规一样将差异传递到STDOUT的东西diff
  • 还有许多其他实用程序,例如vimdiff仅适用于较小的文件。
  • 我还阅读了有关Solaris的信息,bdiff但找不到Linux的端口。

除了将文件分成较小的部分,还有其他想法吗?我有40个这样的文件,所以尽量避免将它们分解的工作。


您尝试过什么版本的xdelta?xdelta3还是xdelta1?
nmuntz 2010年

它是版本1.1.4。xdelta3是否提供不同的功能?我刚刚检查了在线文档,但它似乎仍在提供“增量”。
汤姆B 2010年


Answers:


12

cmp逐字节执行操作,因此它可能不会用完内存(仅在两个7 GB文件上对其进行了测试)-但您可能正在寻找比“文件XY字节不同的列表”更多的详细信息x,第y行”。如果文件的相似性是偏移的(例如,文件Y具有相同的文本块,但不在同一位置),则可以将偏移量传递给cmp;您可能会将它变成与小脚本进行重新同步的比较。

撇开:如果其他人在寻找一种方法来确认两个目录结构(包含非常大的文件)完全相同时落在这里:( diff --recursive --brief或者diff -r -q简称为,甚至是diff -rq)可以工作并且不会耗尽内存。


不错,我认为-q是这里的关键,以某种方式不具备-q可能需要diff将整个文件(或至少整行)放入内存中……
rogerdpack 2014年

7

我找到了这个链接

diff -H可能会有所帮助,或者您可以尝试安装textproc / 2bsd-diff端口,该端口显然不会尝试将文件加载到RAM,因此可以更轻松地处理大型文件。

我不确定您是否尝试过这两个选项,或者它们是否适合您。祝好运。


1
这对外面的人有帮助吗?对我来说,同样的失败...
rogerdpack

12
对于任何想知道的人:diff -H是的未记录且不推荐使用的别名diff --speed-large-files
a3nm

1
这个答案没有帮助。这是一个Linux问题,要安装2bsd-diff,您必须先将其移植。当你发现一个来源。并打上补丁。可能的,但不太可行的解决方案。
纽约,

1

如果文件相同(长度相同),除了几个字节值,则可以使用以下脚本(w是十六进制转储的每行字节数,调整为显示宽度):

w=12;
while read -ru7 x && read -ru8 y;
do
  [ ".$x" = ".$y" ] || echo "$x | $y";
done 7< <(od -vw$w -tx1z FILE1) 8< <(od -vw$w -tx1z FILE2) > DIFF-FILE1-FILE2 &

less DIFF-FILE1-FILE2

速度不是很快,但是可以完成工作。

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.