use strict; use warnings; use File::Spec qw( catfile ); use Time::Local qw( timegm ); sub localdate { my ($time) = @_; my ($y, $m, $d) = (localtime($time))[5, 4, 3]; $y += 1900; $m += 1; return ($y, $m, $d); } sub previous_day { my ($y, $m, $d) = @_; # Use GMT since all days are 24*60*60 seconds long in GMT. my $prev = timegm(0, 0, 0, $d, $m-1, $y) - 24*60*60; my ($p_y, $p_m, $p_d) = (gmtime($prev))[5, 4, 3]; $p_y += 1900; $p_m += 1; return ($p_y, $p_m, $p_d); } sub today { return localdate(time()); } sub yesterday { return previous_day(today()); } { my ($yd_y, $yd_m, $yd_d) = yesterday(); my $dir = ...; opendir(my $dh, $dir) or die("Unable to open log dir \"$dir\": $!\n"); while (my $file_name = readdir($dh)) { my $file_full = catfile($dir, $file_name); next if ! -f $file_full; my $mtime = (stat($file_full))[9]; my ($f_y, $f_m, $f_d) = localdate($mtime); if ( $f_y == $yd_y && $f_m == $yd_m && $f_d == $yd_d ) { ...copy the file... } } }