我想从的结果中放入文件!从lftp中查找命令。
我试过了:
$> 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…)。
我已经通读了整个人lftp(1),看起来你选择的方式实际上是最好的。
!
命令不支持与其他命令直接组合,就像您尝试put < !find ...
一样- 上传文件的唯一方法是使用
put
、mput
或mirror
。正如您所指出的,mirror
对您没有任何用处,因为它保留了路径 put
或mput
命令不支持以任何方式指定带有要上载的文件列表的文件
因此,唯一的可能性是:生成脚本并使用source
运行它
您可以尝试将所有文件放入一个mput
命令中:
!find ./local -type f | awk -v ORS=" " 'BEGIN{print "mput "}{print}' > /tmp/files.lftp
但要小心:虽然我在文档中没有找到,但最大行大小可能有限制!所以我认为最终你的方式是最好的方式。
请注意,您也可以将高尔夫命令编码为:
!find ./local -type f -printf "put %pn" > /tmp/files.lftp
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"/'
如果您知道local
目录的最大深度,您可以使用如下的普通mput
命令:
lcd local && mput * */* */*/* */*/*/*