2012-08-06 205 views
5

我想从!ftp命令的结果中找到!find命令的文件。如何重定向结果“!find ...”命令把lftp命令

我想:

$> lftp -u foo, sftp://bar 
lftp [email protected]$> put < !find ./local -type f 

但失败了!

这工作:

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

有另一种方式!?我想使用stdio重定向(管道,标准输入...)。

+1

'mput'是在ftp上请求“多个”文件的典型方式(而不是“put”)。我没有听说过'lftp',如果'mput <!find ...'有效,我会感到惊讶,但是如果它确实发回,请告诉我们。 'source'方法看起来相当不错。为什么花时间试图修复正在工作的东西?生活太短;-)祝你好运。 – shellter 2012-08-06 21:55:21

+0

我同意你的意见! 'mput <!find ...'不起作用。 让我解释我需要什么。我需要上传从文件中(仅适用于文件): '/本地/富/ 06012012 /本地/富/ 06022012 /本地/富/ 06032012 ... /本地/富/ 07012012 /本地/富/ 07022012 /本地/富/ 07032012 ... /本地/富/ 08012012 /本地/富/ 08022012 /本地/富/ 08032012 ...' 到: '/远程/富/ 062012 /remote/foo/072012 /remote/foo/082012' 'lftp' provides'mirror -R' co以递归方式上传,但是整个路径也被上传。我只需要将数据文件上传到其他路径。 – 2012-08-07 20:38:29

+0

我不认为我能帮上忙,因为我对lftp一无所知,是l = linux吗?这可能有助于在你的问题中添加一个标签来指示你的操作系统。编辑你的问题,在上面的评论中包含信息,格式化为对其他读者有用;-)祝你好运 – shellter 2012-08-07 21:49:24

回答

4

我已经通读了整个man lftp(1)并且看起来你选择的方式实际上是最好的一个

  1. !命令不支持直接与另一种命令,你尝试过put < !find ...
  2. 使用putmputmirror上传文件的唯一方法。 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 
+0

你给的'mput'解决方案几乎是我昨天试过的,关于限制,我尝试了> 2000文件名,它的工作 – greg0ire 2013-12-28 19:37:59

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

sed命令周围的find用双引号(")每个输出线,并预置一put。这将适用于包含空格和一些其他重要字符的文件名,但对于包含双引号,换行符等的文件名将失败......如果您碰巧在文件名中包含这些字符,则可以扩展sed执行的替换操作。

注意,在管符号(|)的前反斜杠(\)时,双链和单引号需要逃避由lsftp命令行分析器解释。要在sh般的外壳,使用测试命令:

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

如果您知道local目录的最大深度,就可以使用纯mput命令是这样的:

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