use strict; use Digest::MD5; use File::Find; use threads; use threads::shared; # # # ------------------------------------------------------------------ # get time # ------------------------------------------------------------------ my @time = localtime(); my $time_string = sprintf "%02d.%02d.%02d", $time[5]+1900, $time[4]+1, $time[3], $time[2], $time[1], $time[0]; # # # ------------------------------------------------------------------ # threads component # ------------------------------------------------------------------ my $StopDotPrintFlag : shared; sub DotPrintThread { my ($Interval, @Trash) = @_; use IO::Handle; autoflush STDOUT 1; my $IntervalCount=0; while ($StopDotPrintFlag != 2) { if ($StopDotPrintFlag == 1) { print STDOUT "."; } $IntervalCount++; sleep $Interval; } return $IntervalCount; } # # # ------------------------------------------------------------------ # file details # ------------------------------------------------------------------ my $directory = '.'; my $result_file = "md5_check_$time_string\.txt"; unlink ("$result_file"); # my @files; find(\&get_dir,$directory); # print "\n\tMD5_CHECK.PL powered by R.Hehlert\n"; # # # ------------------------------------------------------------------ # start threads # ------------------------------------------------------------------ $StopDotPrintFlag = 0; my $Interval = 1; print "\n\tStarting 0% ["; my $DotPrintThread = threads->new(\&DotPrintThread, $Interval); $StopDotPrintFlag = 1; # # # ------------------------------------------------------------------ # start main programm # ------------------------------------------------------------------ for my $file(@files) { my $md5 = Digest::MD5->new; open FILE, $file->[0]; binmode(FILE); while () { $md5->add($_); } my $digest = $md5->hexdigest; close FILE; open(my $fh, ">>$result_file") or die $!; print $fh "Digest is $digest for $file->[1]\n"; close $fh; } # # # ------------------------------------------------------------------ # stop threads # ------------------------------------------------------------------ $StopDotPrintFlag = 2; my $NumberOfPrintedDots=$DotPrintThread->join; print "\t] 100% applied time was ".$NumberOfPrintedDots*$Interval." seconds\n"; print "\n\tPls. read $result_file for results\n"; # # # ------------------------------------------------------------------ # get all files from all directorys # ------------------------------------------------------------------ sub get_dir { push (@files,[$File::Find::name,$_]) if(-f $File::Find::name); } # #END