2012-08-06 201 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 * */* */*/* */*/*/*