AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 565559
Accepted
Basj
Basj
Asked: 2020-02-04 07:30:20 +0800 CST2020-02-04 07:30:20 +0800 CST 2020-02-04 07:30:20 +0800 CST

两个相似的大原始二进制文件的差异

  • 772

假设abc我的本地计算机上有一个 4 GB 的文件。我已经通过 SFTP 将它上传到远程服务器,花了几个小时。

现在我在本地稍微修改了文件(可能最大 50 MB,但不是此文件中的连续字节),并将其保存到abc2. 我还将原始文件保存在abc本地计算机上。

如何计算abc和的二进制差异abc2?

应用:

  • 我只能将patch文件(可能最大 100MB)发送到远程服务器,而不是重新上传整个abc2文件(再次需要几个小时!),并且仅abc2在远程服务器上重新创建。abcpatch

  • 在本地,我可以只保存+ ,而不是浪费 8 GB 来备份abc和,所以它只需要 < 4100 MB。abc2abcpatch

这个怎么做?

PS:对于文本,我知道diff,但在这里我正在寻找适用于任何原始二进制格式的东西,它可以是 zip 文件或可执行文件,甚至是其他类型的文件。

PS2:如果可能,我不想使用rsync; 我知道它可以以有效的方式在两台计算机之间复制更改(而不是重新发送未更改的数据),但是在这里我真的想要一个patch文件,如果我同时拥有abc和patch.

files diff
  • 5 5 个回答
  • 10090 Views

5 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2020-02-04T08:09:16+08:002020-02-04T08:09:16+08:00

    对于第二个应用程序/问题,我会使用类似resticor的重复数据删除备份程序borgbackup,而不是尝试手动跟踪“补丁”或差异。restic备份程序允许您将目录从多台机器备份到同一个备份存储库,在单个机器的文件片段之间以及机器之间对备份数据进行重复数据删除。(我没有使用 的用户经验borgbackup,所以我对该程序无话可说。)

    计算和存储abc和abc2文件的差异可以用rsync.

    这是一个153 MBabc的示例。abc2该文件abc2已通过使用其他一些数据覆盖文件的前 2.3 MB 进行了修改:

    $ ls -lh
    total 626208
    -rw-r--r--  1 kk  wheel   153M Feb  3 16:55 abc
    -rw-r--r--  1 kk  wheel   153M Feb  3 17:02 abc2
    

    我们创建了用于转换的补丁abc并将abc2其命名为abc-diff:

    $ rsync --only-write-batch=abc-diff abc2 abc
    
    $ ls -lh
    total 631026
    -rw-r--r--  1 kk  wheel   153M Feb  3 16:55 abc
    -rw-------  1 kk  wheel   2.3M Feb  3 17:03 abc-diff
    -rwx------  1 kk  wheel    38B Feb  3 17:03 abc-diff.sh
    -rw-r--r--  1 kk  wheel   153M Feb  3 17:02 abc2
    

    生成的文件abc-diff是实际的差异(您的“补丁文件”),同时是为您创建abc-diff.sh的简短 shell 脚本:rsync

    $ cat abc-diff.sh
    rsync --read-batch=abc-diff ${1:-abc}
    

    给定文件,此脚本会进行修改abc,使其变得与 相同:abc2abc-diff

    $ md5sum abc abc2
    be00efe0a7a7d3b793e70e466cbc53c6  abc
    3decbde2d3a87f3d954ccee9d60f249b  abc2
    $ sh abc-diff.sh
    $ md5sum abc abc2
    3decbde2d3a87f3d954ccee9d60f249b  abc
    3decbde2d3a87f3d954ccee9d60f249b  abc2
    

    该文件abc-diff现在可以转移到您拥有的任何其他地方abc。使用该命令rsync --read-batch=abc-diff abc,您可以将补丁应用于文件,将其内容转换为与您创建差异的系统上abc的文件相同。abc2

    第二次重新应用补丁似乎是安全的。没有错误消息,文件内容也没有改变(MD5 校验和没有改变)。

    请注意,除非您创建明确的“反向补丁”,否则无法轻松撤消补丁的应用。


    我还测试了将 2.3 MB 的修改写入数据中的其他位置,稍abc2远一点(大约 50 MB),以及在开始时。生成的“补丁”大小为 4.6 MB,这表明补丁中仅存储了修改后的位。

    • 20
  2. Kaz
    2020-02-04T18:18:41+08:002020-02-04T18:18:41+08:00

    如何计算 abc 和 abc2 的二进制差异?

    使用bsdiff/bspatch或 xdelta 等。

    $ bsdiff older newer patch.bin     # patch.bin is created
    [...]
    $ bspatch older newer patch.bin    # newer is created
    

    但是,需要注意手册页中的这些警告:

    • bsdiff使用的内存等于 oldfile 大小的 17 倍,并且需要绝对最小工作集大小为oldfile大小的 8 倍。
    • bspatch使用的内存等于oldfile的大小加上newfile的大小,但可以容忍非常小的工作集而不会显着降低性能。
    • 4
  3. user1794469
    2020-02-04T08:47:19+08:002020-02-04T08:47:19+08:00

    您是否尝试过强制diff将文件视为文本:

    diff -ua abc abc2
    

    正如这里所解释的。

    • -u输出NUM(默认3)行统一上下文
    • -a将所有文件视为文本

    这应该会给你一个补丁。这样做的缺点是“线条”可能会很长,并且可能会使补丁膨胀。

    • 2
  4. vonbrand
    2020-02-05T05:53:59+08:002020-02-05T05:53:59+08:00

    使用xdelta,它正是为这种用途而创建的。基于最新版本的 VCDIFF (RFC 3284)。

    • 1
  5. Basj
    2020-02-05T01:41:16+08:002020-02-05T01:41:16+08:00

    根据我的测试补充其他答案:

    和diff

    我创建了两个非常相似的 256 MB 文件abc和abc2. 然后让我们创建差异文件:

    diff -ua abc abc2 > abc-abc2.diff
    

    现在让我们尝试恢复abc2原始abc文件和abc-abc2.diff:

    cp abc abc3
    patch abc3 < abc-abc2.diff
    

    或者

    cp abc abc3
    patch abc3 -i abc-abc2.diff
    

    或者

    patch abc -i abc-abc2.diff -o abc3
    

    它适用于 Linux。我也在 Windows 上尝试过(patch.exe 和 diff.exe 也可用),但由于未知原因它失败了:生成的abc3文件只有 1KB 而不是 256MB(我稍后会在这里更新这个答案)。

    和rsync

    如已接受的答案中所述,此方法有效:

    rsync --only-write-batch=abc-abc2-diff abc2 abc
    
    cp abc abc3
    
    rsync --read-batch=abc-abc2-diff abc3 
    

    和rdiff

    如this answer详述,这也是一个解决方案:

    rdiff signature abc abc-signature
    rdiff delta abc-signature abc2 abc-abc2-delta
    
    rdiff patch abc abc-abc2-delta abc3
    

    还在 Windows 上使用 rdiff.exe 进行了测试,并且可以正常工作。

    • 0

相关问题

  • 列出根据特定内容行排序的文件

  • 如何提前知道 .zip 内部是否有父目录

  • 如何找到特定的文件类型并将它们 tar?

  • git:仅在 GUI 中使用视觉差异(融合)

  • du/df 和 ls 报告不同的磁盘使用情况

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve