如何在Windows上的Perl中获取最后修改的ftp目录?

时间:2012-02-17 12:34:41

标签: perl

通过我的@dir = $ ftp-> ls()我可以得到所有目录的列表,但是女巫一个是最新的如何过滤那个。我正在使用Windows操作系统,那些目录来自FTP。

Thnaks

2 个答案:

答案 0 :(得分:1)

对于你粗心大意的问题,你会得到一个肮脏的黑客攻击:

第一:

假设您使用的是Net :: FTP

你必须致电

 $ftp->dir() 

而不是

$ftp->ls()

获取长目录列表。

然后试试这个:

use feature "say";
use Net::FTP;
use Date::Parse;

    $ftp = Net::FTP->new("ftp", Debug => 0)
      or die "Cannot connect to some.host.name: $@";

    $ftp->login("anonymous",'-anonymous@')
      or die "Cannot login ", $ftp->message;

    $ftp->cwd("/pub")
      or die "Cannot change working directory ", $ftp->message;

    @dir = $ftp->dir()
      or die "ls()/dir() failed ", $ftp->message;
#map {say } @dir;

#Now parse the array of strings that dir() returned    
#magic numbers to find substring with modif-date
my $start = 44;
my $len = 10;
@dir = map {$_->[0]} sort {$b->[1] <=> $a->[1]} map {[$_, str2time(substr($_, $start, $len))] } grep {/^d/}  @dir;

$latest = $dir[0];

这仅适用于具有此格式的目录

drwxr-xr-x  17 root     other       4096 Apr 12  2010 software

但不是这个(注意:缺少年份)

drwxr-xr-x  36 root     root        4096 Nov 29 09:14 home

代码也会忽略符号链接,例如:

lrwxrwxrwx   1 root     root           8 May 30  2011 i -> incoming

但它会给你一个开始。

   map{} sort{} map {} @array;

构造被称为“Schwartzian变换”,并且完成了大部分工作。

答案 1 :(得分:1)

$ ftp-&gt; dir返回的字符串可能会有所不同,具体取决于您访问的ftp服务器的类型。操作系统和用户配置也可以影响字符串的格式,因此解析此字符串可能会导致问题,即使它似乎是一个快速的解决方案。使用$ ftp-&gt; mdtm($ file)要容易得多。这将最后修改的日期和时间作为纪元时间返回。简单!