【问题标题】:Comparing files from tape and disk using MD5 with perl archive::tar fails使用 MD5 和 perl archive::tar 比较磁带和磁盘中的文件失败
【发布时间】:2017-05-11 00:10:37
【问题描述】:

我们想要创建一份报告,其中包含磁带上的 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 行使用“strict refs”时,不能使用字符串 ("") 作为子例程 ref。 我的 $f 没有定义。

【问题讨论】:

  • print "OBJ:[$f]\n"; 放入while
  • 它永远不会到达while的内部。添加该行不显示任何输出。我们添加了$Archive::Tar::WARN = 1; $Archive::Tar::DO_NOT_USE_PREFIX=1; 但目前我们不再收到错误消息,但它仍然没有读取磁带。

标签: linux perl archive-tar


【解决方案1】:

在 check_archive.pl 第 12 行的子例程条目中使用未初始化的值。在 check_archive.pl 第 12 行使用“严格引用”时,不能使用字符串 ("") 作为子例程引用。我的 $f 未定义.

if ($f && $f->is_file != 0) {## NOT AN IMPORTANT WARNING...

...

if (-e $filename) { ## CHECK IF FILE EXISTS
    local $/="";    ## <= JUST ADD THIS FOR INSTANT OUTPUT (NO BUFFER)
    open(HANDLE, "<", $filename); ## CREATE A FILE HANDLE TO READ A FILE
    $fileMd5 = md5_hex(<HANDLE>); ## SEND HANDLE TO THE MD5 FUNCTION
}

...

【讨论】:

  • 您能否请edit 多解释一下为什么这段代码回答了这个问题?纯代码答案是 discouraged,因为它们不教授解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2022-01-17
  • 2023-04-02
相关资源
最近更新 更多