Linux 中有 bdiff (1) 吗?

Ant*_*ioK 9 diff

bdiff(1)Solaris 中有一个命令,它允许您处理diff(1)大于 RAM 大小的文件(http://docs.oracle.com/cd/E19683-01/806-7612/files-23/index.html)。

Linux 中有类似的东西吗?我试过谷歌搜索,但我没有bdiff在 Ubuntu 中找到哪个包。

slm*_*slm 13

bdiff 似乎在 Linux上可用(至少作为传家宝工具箱的一部分)。

差异

但是,我可能只会使用带有此开关的常规旧差异:

diff --speed-large-files bigfileA bigfileB
Run Code Online (Sandbox Code Playgroud)

为什么它不起作用?

请参阅@EvanTeitelman 的评论,--speed-large-files不会影响文件加载到内存中的方式。

可以使用以下命令演示/确认不工作:

fallocate -l 10G testa; fallocate -l 10G testb && \
        diff --speed-large-files -a testa testb
Run Code Online (Sandbox Code Playgroud)

差异

很难确认这一点,但我发现了一个名为的工具bsdiff,它源自bdiff. 我已经确认这个工具在 Ubuntu 中,只是apt-get install bsdiff.

为什么它可能有效?

再次感谢@EvanTeitelman 在评论中,bsdiff上面是二进制文件的差异工具。bsdiff是一个二进制差异工具,可以处理大文件。目前还不清楚有多大。请参阅以下讨论其使用的线程的链接。

差异

我认为你也可以使用rdiff来做到这一点。Rdiff 能够处理非常大的文件。

  1. 创建一个文件的签名:

    rdiff signature A sigs.txt
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用生成的签名文件 sigs.txt 和另一个大文件 B 来创建增量:

    rdiff delta sigs.txt B deltaAB.txt
    
    Run Code Online (Sandbox Code Playgroud)
  3. Delta 包含在您只有 A 和 delta 文件 deltaAB.txt 时重新创建文件 B 所需的所有信息。

    要重新创建 B,请运行:

    rdiff patch A deltaAB.txt B
    
    Run Code Online (Sandbox Code Playgroud)

为什么有效?

我发现这篇博客文章的标题是:A Better diff Or What To Do When GNU diff Runs Out of Memory ("diff: memory expired"),其中报告 4.5GB 文件的 rdiff 仅消耗了约 66MB 的 RAM。

十六进制

lfhex是一个用于查看和编辑十六进制、八进制、二进制或 ascii 文本文件的应用程序。lfhex 的主要优势在于它能够处理比系统内存大得多的文件。然而,它是一个 GUI 工具。

截屏

                  lfhex 的 ss]![lfhex 的 ss

参考

  • 不幸的是,似乎 `--speed-large-files` 标志不会影响 GNU diff 将文件加载到内存中的方式。尝试运行 `fallocate -l 10G testa; fallocate -l 10G testb && diff --speed-large-files -a testa testb` 来确认这一点。(或查看源代码。) (3认同)
  • `bsdiff` 是一个二进制 diff 工具,而不是一个大文件 diff 工具。 (2认同)
  • 在 makefile 中用 `/bin/sh` 替换 `/sbin/sh` 后,我设法从传家宝工具箱构建了 `bdiff`。现在,当我尝试就地执行它时,我得到 `bdiff: Can not execute '/usr/5bin/diff'`。抱歉,我不想在 `/usr/5bin/` 中安装任何东西。这不是一个可行的解决方案。此处提到的其他选项对我不起作用,因为我想将差异视为文本。 (2认同)