如何重定向结果“!find ...”命令来放置lftp命令

时间:2012-08-06 21:44:17

标签: linux shell ftp lftp

我想从lftp。

中找到来自!find命令的结果的文件

我试过了:

$> lftp -u foo, sftp://bar
lftp foo@bar$> put < !find ./local -type f

但失败!!

这有效:

$> lftp -u foo, sftp://bar
lftp foo@bar$> !find ./local -type f | awk '{print "put "$1}' > /tmp/files.lftp
lftp foo@bar$> source /tmp/files.lftp

还有另一种方式!?我想使用stdio重定向(管道,stdin ......)。

3 个答案:

答案 0 :(得分:4)

我已经阅读了整个man lftp(1),似乎您选择的方式实际上是最好的

  1. !命令不支持与其他命令直接组合,因为您尝试put < !find ...
  2. 上传文件的唯一方法是使用putmputmirror。正如您所指出的,mirror对您没用,因为它保留了路径。
  3. putmput命令不支持任何指定包含要上传文件列表的文件的方法。
  4. 因此,唯一的可能性就是:生成脚本并使用source来运行它。

    您可以尝试将所有文​​件放入一个mput命令:

    !find ./local -type f | awk -v ORS=" " 'BEGIN{print "mput "}{print}' > /tmp/files.lftp
    

    但要小心:虽然我没有在文档中找到它,但最大行大小可能有限制!所以我认为最终你的方式是最好的方式。

    请注意,您也可以将命令编码为:

    !find ./local -type f -printf "put %p\n" > /tmp/files.lftp
    

答案 1 :(得分:3)

source -e find ./local -type f \| sed \'s/^\(.*\)$/put \"\1\"/\'

sed命令围绕find的每个输出行,并带有双引号("),并且前缀为put。这适用于包含空格和其他一些关键字符的文件名,但对于包含双引号,换行符的文件名将失败,...如果你碰巧有这样的话,你可以扩展由sed执行的替换。文件名中的字符。

请注意,管道符号(\)前面的反斜杠(|),双引号和单引号是lsftp命令行解析器转义解释所必需的。要在类似sh的shell上测试命令,请使用:

find ./local -type f | sed 's/^\(.*\)$/put "\1"/'

答案 2 :(得分:1)

如果你知道local目录的最大深度,你可以使用这样的普通mput命令:

lcd local && mput * */* */*/* */*/*/*