【问题标题】:Dynamic command execution with lftp - multiple commands使用 lftp 执行动态命令 - 多个命令
【发布时间】:2012-08-25 11:20:54
【问题描述】:

我确信有一种简单的方法可以做到这一点,但我没有找到。我要做的是使用lftp执行一系列命令,并且尽可能避免重复连接到服务器。

基本上,我在服务器上有一个包含 ftp 目录列表的文件。我想连接到服务器,然后执行如下操作:(假设此时我已经使用 cat 将文本文件转换为行数组)

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

这当然行不通,但我必须想象有一个简单的解决方案可以解决我想要完成的任务。

在编写 shell 脚本时,我非常缺乏经验。有什么建议吗?

【问题讨论】:

    标签: bash shell loops ftp lftp


    【解决方案1】:

    首先构建一个包含 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
    

    【讨论】:

    • 谢谢。这正是我所需要的。行尾有一些额外的复杂性,因为我(我没有提到这一点)正在处理一个 windows 框 ---> 关于你放的内容,我认为只有两件事可能是错误的(尽管可能是因为窗户)。我根本无法让它与名称中包含空格的目录一起使用 - 这在运行时不会成为问题,但它在测试中搞砸了我。此外,我必须在 = 符号后加上双引号 - 它表示 list_commands=$list_commands 以使其正常工作。绝对把我带到了我需要的地方。谢谢!
    • @user1167442 缺少的双引号是一个错字,已修复。如果您使用IFS=$'\r' instead of IFS=`,则输入文件可以有 Windows 行结尾。带空格的目录应该可以工作(我想,我还没有测试过),出了什么问题?
    • 我尝试了多种转义和取消转义变量周围双引号的变体,如:cd \"$dir\",但在服务器和输出中发生的事情是它只读取它请求的第一部分 - 例如 cd "Folder D" 被解释为 cd "Folder" "D",输出将在文件 "Folder.txt" 和 "D.txt" 中。但是,我并不太担心,因为在运行时,它只会使用大写的无空格字符串,预先转义。不过很奇怪。我用 tr -d "\r" 很容易地处理了 windows \r 问题。非常方便。
    • 我还没有足够的精力去探索 While IFS。不过我会检查一下。感谢您提供信息丰富的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多