我们想在磁带上的 tar 存档和磁盘上的文件之间创建一个带有 MD5 检查的报告。我创建了一个应该执行此操作的脚本,但是使用 tar 文件可以正常工作,但是在磁带上使用 tar 时会失败。tar 是用 gnu tar 写入磁带的。
use strict;
use warnings;
use Archive::Tar;
use Digest::MD5 qw(md5 md5_hex md5_base64);
my $tarfile = '/dev/rmt/1';
my $iter = Archive::Tar->iter( $tarfile, 1, {md5 => 1} );
print "------------ TAR MD5 ----------- ----------- FILE MD5 ----------- ----- File -----\n";
while( my $f = $iter->() ) {
if ($f->is_file != 0) {
my $tarMd5 = md5_hex( $f->get_content);
my $filename = $f->full_path;
my $fileMd5 = '';
if (-e $filename) {
open(HANDLE, "<", $filename);
$fileMd5 = md5_hex(<HANDLE>);
} else {
$fileMd5 = "!!!!!!! FILE IS MISSING !!!!!!!!";
}
if ($tarMd5 eq $fileMd5) {
print "$tarMd5 <--> $fileMd5 --> $filename\n";
} else {
print "$tarMd5 ><>< $fileMd5 --> $filename\n";
}
}
}
如前所述,在使用基于文件的 tar 文件时它可以正常工作,但是在磁带上使用 tar 时,我们会收到错误:
在 check_archive.pl 第 12 行的子例程条目中使用未初始化的值。在 check_archive.pl 第 12 行使用“严格引用”时,不能使用字符串 ("") 作为子例程引用。我的 $f 未定义。