2015-11-12 4 views
0

Используя PERL, я пытаюсь войти на FTP-сервер, загрузить все файлы из определенного каталога, а затем переместить все эти файлы в другой каталог на сервере.Sed Regex в Perl Script

Это мой код до сих пор:

open(my $LFTP,'|-', "lftp -u $ftpuser,$ftppwd -e open $ftpserver") or die "Cannot open lftp: $!"; 
print $LFTP <<"END"; 
       mirror $remoteFiles $datadir 
       renlist $remoteDir | "sed 's#\(.*\)#mv \"\1\" \"outgoing/archive\/\"#'" > list && source list && !rm list 
END 
close($LFTP) or die; # die unless lftp exit code is 0 

файлы загрузить правильно, но они не будут двигаться. Я считаю, что проблема связана с командой sed.

Файл темп создан под названием «список» выглядит следующим образом:

dir1/di2/file1.csv 
dir1/di2/file2.csv 
dir1/di2/file3.csv 
dir1/di2/file4.csv 

Хотя это должно быть похожим, что:

mv "dir1/di2/file1.csv" "outgoing/archive/" 
mv "dir1/di2/file2.csv" "outgoing/archive/" 
mv "dir1/di2/file3.csv" "outgoing/archive/" 
mv "dir1/di2/file4.csv" "outgoing/archive/" 

Похоже, что СЭД регулярное выражение не работает правильно. Однако, если я нахожу ту же самую команду непосредственно на терминале LFTP, она работает нормально.

Не могли бы вы рассказать мне, что не так с моим регулярным выражением, и почему он не будет работать при выполнении скрипта perl?

Спасибо заранее за вашу помощь ....

+1

Это было бы намного проще писать и читать, если бы вы использовали один из многих FTP-модулей Perl. [Net :: FTP] (http://metacpan.org/module/Net::FTP) был распространен как основной модуль с Perl v5.7.3. Мне также интересно, почему вы не загружаете файлы туда, где хотите, в первую очередь? – Borodin

+0

Спасибо. Я не думал об этом, но это выглядит интересно. – r1pster

ответ

1

Выбираясь из \ характера следует сделать трюк:

print $LFTP <<"END"; 
      mirror $remoteFiles $datadir 
      renlist $remoteDir | "sed 's#\\(.*\\)#mv \"\\1\" \"outgoing/archive\/\"#'" 

Ускользающего \ допускает для струнного буквального синтаксиса языка Perl, в результате обратных косых черт, которые экранируют СЕПГ специальных символов.

+0

Блестящий. Это работало как прелесть. благодаря – r1pster

0

Проблема может быть все выделяющиеся (обратные слеши перед символами). Вы можете попробовать распечатать результирующую строку, чтобы проверить, как выглядит команда sed на сервере.
Я попытался немного поработать с ним, а другая обратная косая черта перед «1» (\"\\1\"), вероятно, решит вашу проблему.

Я бы не использовал sed. Предполагая, что вы используете Баш (синтаксис немного отличается от других оболочек):

for file in `renlist $remoteDir`; do 
    mv "$file" outgoing/archive/ 
done 

Это будет просто перебирать ваши файлы и перемещать их.