【问题标题】:How can I download directories and files from an FTP server using Perl?如何使用 Perl 从 FTP 服务器下载目录和文件?
【发布时间】:2011-11-09 12:16:18
【问题描述】:
  1. 我需要从 FTP 服务器下载文件和目录列表。 我已经通过Net::FTP模块连接了FTP服务器。我已经使用cwd 方法更改了工作目录。 FTP 中的当前工作目录包含文件和目录,我将这些列表放在一个数组中。从该数组中,我需要识别目录和文件。在将文件和目录下载到本地之前,我需要将文件和目录从数组中分离出来。

  2. 如何设置下载文件的本地路径?

任何人都可以为我上面列出的问题提供解决方案/建议吗?

【问题讨论】:

  • 如果您只看一下链接到的页面上的get 方法,2 的答案不是很明显吗?

标签: perl ftp


【解决方案1】:

感谢您的所有建议和解决方案。最后我找到了解决方案。 使用 Net::FTP::File 模块,我们可以从我们要下载的 ftp 服务器的存储库中找到/分离目录和文件。我已经分享了这些台词...

use Net::FTP;
use Net::FTP::File;

my $ftp=Net::FTP->new("hostname");
$ftp->login("username","password");
$ftp->cwd("/repository_name");
my @ftp_lists=$ftp->ls("/repository_name ");

foreach my $ftp_file(@ftp_lists){
push @ftp_dirs, $ftp_file if($ftp->isdir($ftp_file));
push @ftp_files, $ftp_file if($ftp->isfile($ftp_file));
}

【讨论】:

  • 不要忘记对有帮助的答案进行投票。通常,您会接受最正确的一个,并且上面的帖子将作为对原始帖子的编辑添加。如果没有一个回答能解决问题,那么您可以发布自己的答案并接受它,但这样做不会给您或您的解决方案贡献者任何积分。
【解决方案2】:

为了识别文件和目录,您可能必须解析$ftp->ls 的返回值。至于设置下载文件的路径,documentation表示:

get ( REMOTE_FILE [, LOCAL_FILE [, WHERE]] )

从服务器获取REMOTE_FILE 并存储在本地。 LOCAL_FILE 可以是文件名或文件句柄。如果未指定,则文件将存储在当前目录中,并与远程文件具有相同的叶子名称。

【讨论】:

  • 我已经使用了您提到的上述代码。例如,我的 @ftp_files_list=$ftp->ls("/tarun");只是我想从数组中识别目录和文件。
  • 优秀。现在,您可以发布$ftp->ls 返回的内容。你有输出,我们没有。我什至无法再访问普通的 FTP 服务器了。
  • 您好,非常感谢您的建议。我已经分享了我已经制定的解决方案。
【解决方案3】:

我知道你问的是使用 Net::FTP,但是我试图做同样的事情,最终使用 wget 作为来自 Perl 内部的系统调用的命令来下载所有文件(实际上是整个网站)到我的本地驱动器,然后我(从另一个系统调用)将这些文件移动到我想要它们的位置,因为wget 创建了一个从根目录开始的文件夹结构,所以我不得不将它们mv 移动到其他地方。代码看起来像这样(您必须针对您的设置对其进行测试并获取正确的目录):

my $username = "tim";
my $password = "asdfghj";
my $domain   = "example.com";
my $get = `wget -P /var/www/$domain/ -m ftp://$username:$password\@$domain/httpdocs`;
my $mv  = `mv /var/www/$domain/httpdocs/* ../`;
my $del = `rm /var/www/$domain/httpdocs/`;

抱歉,它不是 Net::FTP,但如果您需要大量文件,它会更快,更不会令人沮丧,您可以通过 Net::FTP 获得更多控制权……我从一个网络应用程序运行它并使用它将整个网站从一台服务器移动到另一台服务器并知道它的魅力:)

【讨论】:

  • 关于 wget 的不足之处?这是相当有限的,因为您不能轻松地浏览服务器上的目录,然后决定是否要获取特定文件。如果你想绝对控制你能做的一切,Net::ftp 是极好的我猜。 - 你的最终目标具体是什么?
  • 您可以使用 wget 限制文件和目录,它在文档中。wget 的另一个缺点是,如果它不是您的服务器并且未安装,那么您将不得不要求管理员安装它...
  • 您的解决方案很有帮助。问题是我正在 Windows 中开发 perl 脚本。我正在开发一种工具来下载列出的文件,用户在文本文件或日志文件中提到了这些文件。在从 ftp 下载文件之前,我需要分离目录和文件。只是我想在 FTP 的存储库(我要从中下载)中获取目录名和文件名。
  • 使用 wget for windows sourceforge.net/projects/gnuwin32/files/wget/1.11.4-1/… 您可以下载某个目录,$get 变量应该包含它下载的文件,如果您愿意,您可以轻松地将其解析为文件名。为此,您可以从wget -nv ... 开始到您的命令。一些文档在这里,并且还解释了使用-r 进行递归的参考:gnu.org/software/wget/manual/wget.html(我要睡觉了!)
猜你喜欢
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多