我有一个看起来像这样的文件:
ftp://url1/files1.tar.gz dir1
ftp://url2/files2.txt dir2
.... many more...
我想要做的是这些步骤:
但是我的这种方法怎么会起作用
while(<>) {
chomp;
my ($url,$dir) = split(/\t/,$_);
system("mkdir $dir");
system("cd $dir");
system("wget $url"); # This doesn't get executed
}
这样做的正确方法是什么?
答案 0 :(得分:13)
尽可能使用原生Perl解决方案:
cd
可以使用chdir mkdir
可以使用mkdir mkdir -p
(如果dir存在则不会死,递归创建)可以使用Perl附带的File::Path来完成wget
可以使用LWP::Simple 我将如何实现这一点:
use File::Spec::Functions qw(catfile); # adds a '/' between things (or '\' on Windows)
use LWP::Simple qw(mirror);
use File::Path qw(mkpath);
use File::Basename;
use URI;
while (<>) {
chomp;
my ($url, $dir) = split /\t/;
mkpath($dir);
# Use the 'filename' of the $url to save
my $file = basename(URI->new($url)->path);
mirror($url, catfile($dir, $file));
}
如果你这样做,你会得到:
die
)答案 1 :(得分:4)
我会告诉你一个错误。 system("cd $dir");
将创建一个子shell,切换到目录中的子shell,然后退出。
运行Perl的进程仍然在其原始目录中。
我不确定这是否是您的具体问题,因为# Fail here
对细节有点了解: - )
一种可能的解决方法是:
system("mkdir $dir && cd $dir && wget $url");
这将在一个子shell中完成所有操作,因此不应该遇到上述问题。
实际上,这个脚本运行正常:
use strict;
use warnings;
system ("mkdir qwert && cd qwert && pwd && cd .. && rmdir qwert");
输出:
/home/pax/qwert