LWP :: UserAgent从ftp目录列表中检索文件的日期和时间

时间:2014-02-11 09:48:48

标签: perl ftp

我正在尝试检索远程ftp站点上文件的上次修改时间,如下所示:

my $ua = LWP::UserAgent->new;
my $index = $ua->get($ftp); # where $ftp contains the url to the ftp-folder of interest
print $index->decoded_content;

然而,这会打印遥控器的内容,如下所示:

-rw-r--r--   1 user group  size Month Date Year filename

我希望内容包含小时:分钟:秒,格式为'ls -l':

-rw-r--r--   1 user  group size Year-Month-Date hour:minute:seconds filename

我该怎么做?

答案:

感谢下面接受的答案,我了解到get()会给出LIST的回复,其中MLSD包含我需要的所有信息。

use strict;
use warnings;
use Net::FTP;

my $host=$ARGV[0];
my $ftp = Net::FTP->new($host) or die "Can't open $host\n";
$ftp->login;
my @mlsd=$ftp->_list_cmd("MLSD",".") or die "MLSD failed:",$ftp->message;
for my $content (@mlsd) {
    next unless (index($content, "type=file") != -1);
    my @info = split ";",$content;
    my $filename=$info[5];
    (my $filesize = $info[1]) =~ s/size=//g;
    (my $filedate=$info[2]) =~ s/modify=//g;
    $filedate =~ s/^(....)(..)(..)(..)(..)(..)\z/$1-$2-$3 $4:$5:$6/s;
    printf ("%-20s %10s %11s\n",$filename,$filesize,$filedate);
}
$ftp->quit;
exit;

如果可以通过LWP::UserAgent实现这一点,那当然会很好。

1 个答案:

答案 0 :(得分:0)

您获得的是FTP LIST命令的原始输出。不幸的是,此命令的输出格式未标准化。但您可以使用MDTM命令获取修改时间。 LWP::UserAgent不支持此功能,因此您必须直接使用Net::FTP

use Net::FTP;

my $ftp = Net::FTP->new($host);
$ftp->login;

for my $file ($ftp->ls) {
    next if $file eq '.' || $file eq '..';

    my $time = $ftp->mdtm($file); # UNIX timestamp
    my ($sec, $min, $hour, $mday, $mon, $year) = localtime($time);
    printf(
        "$file: %04d-%02d-%02d %02d:%02d:%02d\n",
        $year + 1900, $mon + 1, $mday,
        $hour, $min, $sec,
    );
}