我想在 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.pl
并perl 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
工作原理如下,在发送任何内容之前,计算校验和以查看文件各部分是否存在差异。
我不确定它在处理这么大的文件时效果如何,尽管我从未听说过它有任何文件大小限制。