0

使用 PERL,我试图登录到 FTP 服务器,从特定目录下载所有文件,然后将所有这些文件移动到服务器上的另一个目录。

到目前为止,这是我的代码:

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 命令上。

创建的名为“list”的临时文件如下所示:

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/"

sed 正则表达式似乎无法正常工作。但是,如果我直接在 LFTP 终端上键入完全相同的命令,它就可以正常工作。

您能否告诉我我的正则表达式有什么问题以及为什么在 perl 脚本中执行时它不起作用?

预先感谢您的帮助....

4

2 回答 2

1

转义\字符应该可以解决问题:

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

转义\perl 的字符串文字语法的承认,导致转义 sed 特殊字符的反斜杠。

于 2015-11-12T13:56:13.047 回答
0

问题可能是所有转义(字符前的反斜杠)。您可以尝试打印结果字符串以检查 sed 命令在服务器上的样子。
我试着把它弄乱了一点,在 '1' ( \"\\1\") 之前的另一个反斜杠可能会解决你的问题。

我不会使用 sed。假设您使用的是 bash(其他 shell 的语法有点不同):

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

这只会遍历您的文件并移动它们。

于 2015-11-12T13:46:55.637 回答