1

テープ上の 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 は定義されていません。

4

1 に答える 1

0

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
}

...

于 2015-06-15T01:08:18.760 に答える