# ------------------------------------------------------------------ # loaded modules # ------------------------------------------------------------------ use strict; use warnings; use Digest::MD5; use Cwd; use File::Find; use threads; use threads::shared; # # # ------------------------------------------------------------------ # start threads # ------------------------------------------------------------------ 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; } # # # ------------------------------------------------------------------ # start programm # ------------------------------------------------------------------ my $dir = getcwd; my @files; find(\&get_dir,$dir); $StopDotPrintFlag = 0; my $Interval = 1; my $DotPrintThread = threads->new(\&DotPrintThread, $Interval); $StopDotPrintFlag = 1; for my $file(@files) { my $md5 = Digest::MD5->new; open FILE, $file; binmode(FILE); while() { $md5->add($_); } my $digest = $md5->hexdigest; close FILE; open(my $fh, ">>md5_check.txt") or die $!; print $fh "\nDigest is $digest for $file\n"; close $fh; } $StopDotPrintFlag = 2; my $NumberOfPrintedDots=$DotPrintThread->join; print "\napplied time was ".$NumberOfPrintedDots*$Interval." seconds\n"; sub get_dir { push(@files,$File::Find::name) if(-f $File::Find::name); }