Are you using Net::FTP? You can get the modification times with that module, then look for the file with the newest modification time. For example:
#!/usr/bin/perl
use Net::FTP;
my $ftp = Net::FTP->new('ftp.cpan.org', Debug => 1)
or die "Couldn't connect\n";
$ftp->login('anonymous','')
or die "Couldn't log in\n";
my $newestfile;
my $newesttime = 0;
foreach my $file ($ftp->ls)
{
my $mdtm = $ftp->mdtm($file)
or next;
if ($mdtm > $newesttime)
{
$newestfile = $file;
$newesttime = $mdtm;
}
}
print "Getting file '$file'\n";
$ftp->get($newestfile);
| [reply] [d/l] |
| [reply] |
You don't have to parse it yourself, you can use File::Listing instead.
| [reply] |
As Abigal-II has pointed out, not all FTP servers support transmitting file modification times, and the ones that do may not even transmit them in the same format. I think you have two options:
- Write a client-side script to parse the output of "ls -l" and grab the latest file
- Write a server-side script that symlinks the latest file to a known filename, such as "latest"
Here's some example code for the second way of doing things. Some example code is shown below: #!/usr/bin/perl -w
use strict;
my $ftp_dir = '/pub/';
my @files = glob("$ftp_dir/*");
my ($latest_file,$modtime) = (0,0);
foreach my $file (@files) {
my $local_modtime = (stat($file))[9];
if ( $local_modtime > $modtime ) {
$latest_file = $file;
$modtime = $local_modtime;
}
}
# There's probably a better way to make symlinks
`ln -s $ftp_dir/$latest_file $ftp_dir/latest`;
The code is untested, but hopefully it can get the point across. | [reply] [d/l] |
Check out this node on how to parse the timestamps coming back from Net::FTP's dir() method.
With this tool under your belt, you'll probably come up with something like this:
use warnings;
use strict;
use Net::FTP;
use File::Listing;
use List::Util qw(reduce);
my $ftp = Net::FTP->new('ftp.host.com');
$ftp->login('username', 'password');
my $latest = reduce { $b->[3] < $a->[3] ? $a : $b }
File::Listing::parse_dir($ftp->dir());
print "Last modified file is: '$latest->[0]'\n";
| [reply] [d/l] [select] |