我想从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 ......)。
答案 0 :(得分:4)
我已经阅读了整个man 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 %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 * */* */*/* */*/*/*