为什么我不能使用perl从FTP将多个文件下载到本地目录?

时间:2018-08-16 09:44:27

标签: perl ftp

我编写了以下代码以连接到ftp位置并将一个文件下载到本地文件系统中。

Themes/generic.xaml

根本没有问题,它是在我的LFS上下载并存储一个文件。但是我有多个文件要下载。因此,我在#!/usr/local/bin/perl -w use strict; use Net::FTP; my $hostname = 'mirror.anl.gov'; my $username = 'anonymous'; my $password = 'username@domain.com'; # Hardcode the directory and filename to get my $home = '/pub'; my $filename = 'motd'; # Hardcode the local directory my $localdir = '/home/boy/'; # Open the connection to the host my $ftp = Net::FTP->new($hostname) or die "Cannot connect to $hostname: $@"; # Construct object $ftp->login($username, $password) or die "Cannot login ", $ftp->message;; # Log in $ftp->cwd($home) or die "Cannot change working directory ", $ftp->message;# Change +directory my @filelist=$ftp->ls($home); print map { "$_\n"} @filelist; # Now get the file and leave $ftp->get($filename,$localdir.$filename) or die "Cannot get $filename: $@"; $ftp->quit; 上使用了foreach循环,如下所示:

@filelist

但是现在我在最后一个foreach(@filelist){ print map { "$_\n"} @filelist; # Now get the file and leave $ftp->get($filename,$localdir.$filename) or die "Cannot get $filename: $@"; } 上遇到了错误。由于必须获取多个文件,因此现在我从​​代码中删除了die,现在$filename循环如下所示:

foreach

但是我又遇到了同样的错误。现在我知道,foreach(@filelist){ print map { "$_\n"} @filelist; # Now get the file and leave $ftp->get($localdir) or die "Cannot get $filename: $@"; } 函数在我们仅需要下载单个文件时使用,get在我们需要下载多个文件时使用。但是当我使用̀mget`时,出现以下错误:

mget

那我们如何完成任务呢?

2 个答案:

答案 0 :(得分:3)

您遍历了文件列表,但是没有使用迭代器(即列表中的每个元素)。

for my $filename (@filelist) {
    $ftp->get($filename, "$localdir/$filename")
        or die "...";
}

答案 1 :(得分:1)

  

现在我知道,get函数仅在需要下载单个文件时使用,mget是在我们需要下载多个文件时使用

mget是某些FTP客户端(IBM,Microsoft等)中可用的命令,但在RFC 959(FTP规范)中不存在。 Net::FTP模块也不提供此功能。必须使用NLST(名称列表)和GET命令来实现,如果需要,还可以使用内部glob过滤器的补充。

请注意,RFC说明了NLST

  

该命令旨在               返回程序可以使用的信息               自动进一步处理文件。例如,在               实现“多次获取”功能。