检查压缩文件的md5而不完全解压它

发布于 2024-07-25 20:09:17 字数 99 浏览 4 评论 0原文

我想检查使用 dd 复制到 Windows 共享的 Ubuntu 磁盘备份的完整性。 没有足够的空间来解压缩备份。 有没有一个实用程序可以计算压缩文件的 md5 而无需完全解压它?

I want to check the integrity of a backup of a Ubuntu disk, copied with dd onto a Windows share. There is not enough space to unpack the backup. Is there a utility to calculate the md5 of a compressed file without unpacking it completely?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

香草可樂 2024-08-01 20:09:17

这:

gzip -d -c myfile.gz | md5sum

将解压缩的内容流式传输到 md5sum,而不是将整个内容加载到内存中。

如果是 zip 文件,则命令为 unzip -p myfile.zip | md5和

This:

gzip -d -c myfile.gz | md5sum

will stream the decompressed content into md5sum, rather than loading the whole thing into memory.

If it's a zip file, the command is unzip -p myfile.zip | md5sum

锦爱 2024-08-01 20:09:17

使用 gzip/zcat 和管道到 md5sum (我在写这篇文章时已经有人发布)的简单答案是可行的,但如果你想获得更多乐趣,这里是一个简短的 Perl 脚本可以做同样的事情。

#!/usr/bin/perl

use strict;
use warnings;

use Archive::Zip qw/:ERROR_CODES :CONSTANTS/;
use Digest::MD5;

die "Usage: $0 zipfile filename" unless @ARGV == 2;

my $zipfile = $ARGV[0];
my $filename = $ARGV[1];

my $z = Archive::Zip->new();
die "Error reading $zipfile" unless $z->read($zipfile) == AZ_OK;
my $member = $z->memberNamed($filename);
die "Could not find $filename in $zipfile" unless $member;
$member->desiredCompressionMethod(COMPRESSION_STORED);
$member->rewindData();

my $md5 = Digest::MD5->new;
while(1) {
        my($buf,$status) = $member->readChunk();
        $md5->add($buf) if $status == AZ_STREAM_END || $status == AZ_OK;
        last if $status == AZ_STREAM_END;
        die "IO Error" if $status != AZ_OK;
}
my $digest = $md5->hexdigest;
print "$digest  $zipfile/$filename\n";

The simple answer using gzip/zcat and piping to md5sum (which someone already posted while I was writing this) will work, but if you want to have more fun, here is a short Perl script which will do the same thing.

#!/usr/bin/perl

use strict;
use warnings;

use Archive::Zip qw/:ERROR_CODES :CONSTANTS/;
use Digest::MD5;

die "Usage: $0 zipfile filename" unless @ARGV == 2;

my $zipfile = $ARGV[0];
my $filename = $ARGV[1];

my $z = Archive::Zip->new();
die "Error reading $zipfile" unless $z->read($zipfile) == AZ_OK;
my $member = $z->memberNamed($filename);
die "Could not find $filename in $zipfile" unless $member;
$member->desiredCompressionMethod(COMPRESSION_STORED);
$member->rewindData();

my $md5 = Digest::MD5->new;
while(1) {
        my($buf,$status) = $member->readChunk();
        $md5->add($buf) if $status == AZ_STREAM_END || $status == AZ_OK;
        last if $status == AZ_STREAM_END;
        die "IO Error" if $status != AZ_OK;
}
my $digest = $md5->hexdigest;
print "$digest  $zipfile/$filename\n";
蔚蓝源自深海 2024-08-01 20:09:17

这很复杂吗? 我的方法是,只需使用

md5sum file.gz

并验证我拥有的 md5 和,我认为这不需要解压它。
如果我错了,请纠正我。

Is this complicated? My way is, just use

md5sum file.gz

and verify the md5 sum with the one I have, I think this doesn't need to unpack this.
Correct me, If I am wrong.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文