计算管道中每 1MB 部分的 md5sum

计算管道中每 1MB 部分的 md5sum

我想在 unix/linux 中对大文件和流进行校验和计算,并且想从文件/流的每个大部分(每 1 MB 或每 10MB)获取许多校验和。

例如,我有磁盘映像、压缩磁盘映像和原始磁盘的副本。映像的某些部分可能会被修改。磁盘为 50 GB,大约有 50000 个 1 MB 块。因此,对于每个文件,我希望获取 50 000 个 md5sum 或 sha1sums 以获取修改概览。单个 md5sum 无法帮助我找到修改偏移量。

对于未压缩的磁盘映像,此任务很容易,只需在 bash 中使用循环dd工具for计算偏移量并选择(跳过)文件的每个 1MB 部分即可。磁盘也是一样:

for a in `seq 1 50000`; do echo -n "$a: "; dd if=image.src bs=1M count=1 skip=$a | md5sum; done

但现在我想比较压缩图像和未压缩图像,而无需将其解压到磁盘。我有7z一个解压器,可以高速将图像解压到标准输出,速度高达 150-200 MB/s(选项7z e -so image.7z |)。但是我可以在符号后写什么|来获取所有文件部分的 md5sum。

答案1

像这个 Perl 脚本这样简单的东西可能就足够了。

$amount = 1_000_000;
while (read(STDIN, $buffer, $amount) > 0) {
    open MD5, "|md5";
    print MD5 $buffer;
    close MD5;
}

将其放入foo.plperl foo.pl在管道末尾调用它。

答案2

分裂coreutils(大多数 Linux 发行版的默认设置)中有一个--filter可以使用的选项:

7z e -so image.7z | split -b 1000000 --filter=md5sum

答案3

我觉得你正在寻找这种工具

来自 BigSync 的 Readme 文件:

Bigsync 是一种将单个大文件增量备份到慢速目标(例如网络媒体或廉价 NAS)的工具。bigsync 最常见的情况是磁盘映像、虚拟操作系统、加密卷和原始设备。

Bigsync 将分块读取源文件并计算每个块的校验和。它会将这些校验和与目标文件先前存储的值进行比较,如果校验和不同,则覆盖已更改的块。

这样,我们可以最大限度地减少对缓慢目标媒体的访问,这正是 bigsync 存在的全部意义所在。

答案4

rsync工作原理如下,在发送任何内容之前,计算校验和以查看文件各部分是否存在差异。

我不确定它在处理这么大的文件时效果如何,尽管我从未听说过它有任何文件大小限制。

相关内容