#!/opt/perl/bin/perl -w
use strict;
use Digest::MD5 qw(md5 md5_hex md5_base64);
#校正檔案函數
sub calc_md5_hex() {
my ($file_name, $ctx, $md5);
( $file_name ) = @_;
open (FILEHANDLE,$file_name) or die "Can't open /'$file_name/': $!";
$ctx = Digest::MD5->new;
binmode(FILEHANDLE);
$ctx->addfile( *FILEHANDLE ) || die "$!/n";
$md5 = $ctx->hexdigest;
close FILEHANDLE;
return $md5;
}
sub calc_md5_ASCII() {
my ($file_name, $ctx, $md5);
( $file_name ) = @_;
open (FILEHANDLE,$file_name) or die "Can't open /'$file_name/': $!";
$ctx = Digest::MD5->new;
#binmode(FILEHANDLE);
$ctx->addfile( *FILEHANDLE ) || die "$!/n";
$md5 = $ctx->hexdigest;
close FILEHANDLE;
return $md5;
}
#定義目錄路徑
my $dirhandle = $ARGV[0];
#my $file_only = $ARGV[1]; #定義是否只是檔案測試,給驗證單個檔案調用
if ( -f $dirhandle ){
my $file_md5;
if ( -T $dirhandle ) {
$file_md5 = &calc_md5_ASCII($dirhandle);
}elsif( -B $dirhandle ){
$file_md5 = &calc_md5_hex($dirhandle);
}
print "開始計算檔案MD5值:/n${dirhandle}/n/t[${file_md5}][MD5_hex]/n";
exit 0;
}elsif( -d $dirhandle ){
my $file_md5;
print "開始驗證目錄下所有檔案:/n";
opendir (DH,"$dirhandle") or die "Can't oprn dir /'$dirhandle/': $!";
foreach my $file ( readdir DH ){
$file=$dirhandle.'/'.$file;
if ( -f $file ){
next if ($file =~ m{/.$} || $file =~ m{/..$} || -l $file );
if ( -T $file ) {
#print "按照文字檔進行計算MD5!/n";
$file_md5 = &calc_md5_ASCII($file);
print "開始計算檔案MD5值:/n${file}/n/t[${file_md5}][MD5_ascii]/n";
}elsif( -B $file ){
#print "按照二進位檔案進行計算MD5!/n";
$file_md5 = &calc_md5_hex($file);
print "開始計算檔案MD5值:/n${file}/n/t[${file_md5}][MD5_hex]/n";
}else{
print "不能識別檔案檔案為二進位還是文本,按照二進位檔案進行計算!/n";
$file_md5 = &calc_md5_hex($file);
print "開始計算檔案MD5值:/n${file}/n/t[${file_md5}][MD5_hex]/n";
}
}
}
closedir DH;
}