On Oct 5, 7:50 am, [EMAIL PROTECTED] (Jeff Pang) wrote:
> 2007/10/5, [EMAIL PROTECTED]
> <[EMAIL PROTECTED]>:
>
> > I would like to compare two files by comparing the files dates.
> > If one file shows
> > ls -la May 12 2003 filename
> > and the other name shows the same date they are OK for me (I'm not
> > interested in the time part only the date of the file)
> > But if the dates are not the same I would like to copy one of the
> > files.
> > How do I do this in Perl?

> if ( int(-M "file1.txt") != int(-M "file2.txt") ) {
>     # copy the file
> }

That's a very naïve approach that will frequently fail.
For example:
File one modified 10/1/2007 9am
File two modified 10/1/2007 3pm
and the current time is 10/2/2007 12pm

-M 'file1' will return 1.125
-M 'file2' will return 0.875.

int(1.25) == 1
int(0.875) == 0

There are two possible "correct" solutions.  One is to actually
execute `ls -l` for each file and parse the output.  The other is to
take the return values of the -M calls, subtract them from the current
unix time stamp, convert both times to date strings, and then compare
the dates.  For example:

#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw/strftime/;
my $date1 = m_to_date(-M 'file1.txt');
my $date2 = m_to_date(-M 'file2.txt');
if ($date1 eq $date2) {
   # copy the file
}
sub m_to_date {
   my $days_ago = shift;
   my $ts = time() - ($days_ago * 24 * 60 * 60);
   my $date = strftime('%Y-%m-%d', localtime($ts));
   return $date;
}
__END__

Paul Lalli


--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to