我确信有一种简单的方法可以做到这一点,但我找不到它。我想要做的是使用lftp执行一系列命令,我想尽可能避免重复连接到服务器。
基本上,我有一个文件,其中列出了服务器上的ftp目录。我想连接到服务器然后执行类似下面的操作:(假设此时我已经使用cat将文本文件转换为行数组)
for f in "${myarray}"
do
cd $f;
nlist >> $f.txt;
cd ..;
done
当然这不起作用,但我必须想象有一个简单的解决方案来解决我想要实现的目标。
在shell脚本方面我很缺乏经验。有什么建议吗?
答案 0 :(得分:6)
首先构建一个包含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