2012-08-30 64 views
2

我确信有一个简单的方法可以做到这一点,但我没有找到它。我想要做的是使用lftp执行一系列命令,并且我想避免在可能的情况下反复连接到服务器。使用lftp执行动态命令 - 多个命令

基本上,我有一个文件,其中包含一个完整的ftp目录在服务器上的列表。我想连接到服务器,然后执行类似如下:(假设在这一点上,我已经转换的文本文件导入使用cat线的阵列)

for f in "${myarray}" 
do 
cd $f; 
nlist >> $f.txt; 
cd ..; 
done 

当然,这并不工作,但我不得不想像我有一个简单的解决方案,我正在努力完成。

对于shell脚本,我很缺乏经验。有什么建议么?

回答

5

首先构建一个包含lftp命令列表的字符串。然后调用lftp,在标准输入上传递命令。 Lftp本身可以将命令的输出重定向到文件,其语法类似于shell。

list_commands="" 
for dir in "${myarray[@]}"; do 
    list_commands="$list_commands 
    cd \"$dir\" 
    nlist >\"$dir.txt\" 
    cd .." 
done 

lftp <<EOF 
open -u $username,$password $site 
$list_commands 
bye 
EOF 

请注意,我假定目录名不包含反斜杠,单引号或通配符。如有必要添加适当的转义。请参阅Why is while IFS= read used so often, instead of IFS=; while read..?。您可能更愿意将目录列表中的读数与构建命令相结合:

list_commands="" 
while IFS= read -r dir; do 
    list_commands="$list_commands 
    cd \"$dir\" 
    nlist >\"$dir.txt\" 
    cd .." 
done <directory_list.txt 
+0

谢谢。这正是我需要的。由于我(我没有提到这一点)在一个窗口框中工作,所以有一些增加了行结尾的复杂性--->我认为可能是错误的只有两件事是关于你所说的(尽管这可能是因为的窗户)。我简直无法让它与名称中有空格的目录一起工作 - 这在运行时不会成为问题,但它让我在测试中感到困惑。另外,我必须在=符号后面加双引号 - 它表示list_commands = $ list_commands才能使其工作。绝对让我在需要的地方。谢谢! – user1167442

+0

@ user1167442缺少双引号是错误的,修正了。如果您使用IFS = $'\ r'而不是'IFS =',则输入文件可以具有Windows行结束符。有空间的目录应该工作(我想,我还没有测试过),出了什么问题? – Gilles

+0

我尝试了多个变体的转义和绕过变量的双引号,如下所示:cd \“$ dir \”,但是在服务器和输出中都发生了什么,它只将它读作请求的第一部分 - 例如cd“Folder D”被解释为cd“Folder”“D”,并且输出将在文件“Folder.txt”和“D.txt”中。不过,我并不太担心它,因为在运行时,它只能使用预先转义的大写非空格字符串。虽然奇怪。我用tr -d“\ r”很容易地处理了windows \ r问题。非常便利。 – user1167442