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?
+4
A:
This:
gzip -d -c myfile.gz | md5sum
will stream the decompressed content into md5sum, rather than loading the whole thing into memory.
RichieHindle
2009-06-28 10:21:22
+1
A:
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";
Adam Batkin
2009-06-28 11:21:10