Как я могу создать каталог и извлечь файл через FTP в этот каталог, используя Perl? - PullRequest
2 голосов
/ 25 мая 2010

У меня есть файл, который выглядит так:

ftp://url1/files1.tar.gz dir1
ftp://url2/files2.txt dir2
.... many more...

Что я хочу сделать, это следующие шаги:

  1. Создать каталог на основе столбца 2
  2. Unix 'cd' в этот каталог
  3. Загрузить файл с помощью wget на основе column1

Но почему мой подход не работает

while(<>) {
  chomp;
  my ($url,$dir) = split(/\t/,$_);
  system("mkdir $dir");
  system("cd $dir");   
  system("wget $url"); # This doesn't get executed
}

Какой правильный способ сделать это?

Ответы [ 2 ]

13 голосов
/ 25 мая 2010

По возможности используйте собственные решения Perl:

  • cd можно сделать с помощью chdir
  • mkdir можно сделать с помощью mkdir
  • mkdir -p (не умирайте, если dir существует, рекурсивное создание) можно сделать с помощью File :: Path , который поставляется с Perl
  • 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));
}

Если вы сделаете это, вы получите:

  • Переносимость между платформами
  • Переносимость между оболочками
  • Обработка исключений Perl (через возвращаемые значения или die)
  • Perl ввод / вывод (не нужно ничего экранировать)
  • FLexibility в будущем (если вы измените способ расчета имен файлов, или как вы храните веб-контент, или если вы хотите выполнять веб-запросы параллельно)
4 голосов
/ 25 мая 2010

Я скажу вам одна вещь не так. system("cd $dir"); создаст под-оболочку, перейдет в каталог внутри этой под-оболочки и выйдет.

Процесс, выполняющий Perl, все еще будет в своем первоначальном каталоге.

Я не уверен, что это ваша конкретная проблема, поскольку # Fail here немного освещает детали: -)

Одно из возможных исправлений:

system("mkdir $dir && cd $dir && wget $url");

Это сделает всю работу в одной суб-оболочке, поэтому не должно страдать от упомянутых проблем.


На самом деле этот скрипт работает нормально:

use strict;
use warnings;
system ("mkdir qwert && cd qwert && pwd && cd .. && rmdir qwert");

Вывод:

/home/pax/qwert
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...