Net::FTPをつかってFTPからファイル情報を取り出すよ。
まず、Net::FTPでFTPに接続。次のようなノリで。
my $ftp = Net::FTP->new($hostname); $ftp->login($user,$password);
で、$ftp->dirを再帰的に実行する。ls -l形式にマッチする素敵な正規表現はCPANから拝借。
sub print_file {
my($ftp, $dir) = @_;
my @files = $ftp->dir()
or warn "Can't LIST: ", $ftp->message;
return unless @files;
print "into $dir\n";
for (@files) {
s/\r//g;
s/\n//g;
if (/
^
(.|-) # (1) type
(.{9}) # (2) permittion
\s+
(\d+) # (3) links
\s+
(\w+) # (4) owner
\s+
(\w+) # (5) group
\s+
(\d+) # (6) size
\s+
(\w{3}\s+\d+\s+\d+:\d+) # (7) date
\s+
(.*?) # (8) filename
(?:\s+->\s+(.*))? # (9) link
$
/x)
{
print "$dir/$8 $6 $7";
if ($1 eq 'd') {
my $next_dir = File::Spec->catfile($dir, $8);
$ftp->cwd($8);
&print_file($tree, $ftp, $next_dir);
$ftp->cdup();
}
}
}
}
ここまで来るのに、なにかとハマったので、ポイント羅列しとこう。
- $ftp->dirは$ftp->listのラッパー。なにかといろいろやってくれるので$ftp->dirを使う。
- $ftp->dirの返り値の各行にCRLFついてる(こともある?)
- $ftp->dirには絶対パスをわたすより、$ftp->cwdでワーキングディレクトリ変えてから相対パス渡す方が良い。