5

我想从 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

有没有别的办法!?我想使用标准输入输出重定向(管道、标准输入...)。

4

3 回答 3

4

我通读了整个人 lftp(1),看来您选择的方式实际上是最好的方式

  1. !command 不支持与其他命令直接组合,正如您尝试的那样put < !find ...
  2. 上传文件的唯一方法是使用put,mputmirror. mirror正如您所指出的,它对您没有用,因为它保留了路径。
  3. putmput命令不支持以任何方式指定要上传的文件列表的文件。

所以,唯一的可能就是你所拥有的:生成脚本并使用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
于 2013-12-28T14:21:12.663 回答
3
source -e find ./local -type f \| sed \'s/^\(.*\)$/put \"\1\"/\'

该命令用双引号 ( ) 将sed每个输出行括起来,并在前面加上. 这将适用于包含空格和一些其他关键字符的文件名,但对于包含双引号、换行符等的文件名将失败...如果您的文件名中碰巧有这样的字符,您可以扩展相应的替换。find"putsed

请注意,\管道符号 ( ) 前面的反斜杠 ( ) |、双引号和单引号是为了逃避lsftp命令行解析器的解释。要在sh-like shell 上测试命令,请使用:

find ./local -type f | sed 's/^\(.*\)$/put "\1"/'
于 2013-12-31T02:10:41.740 回答
1

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

lcd local && mput * */* */*/* */*/*/*
于 2016-04-06T10:50:25.187 回答