2010-04-10 81 views
6

我寫一個小shell腳本,需要經過一個FTP服務器(遞歸)上的所有文件夾和文件的外殼/ bash的上市。到目前爲止,一切正常使用cURL - 但它很慢,因爲cURL爲每個命令啓動一個新的會話。因此,對於500個目錄,cURL執行500次登錄。遞歸FTP目錄有一個會話(使用捲曲或FTP)

是否有人知道,我是否可以使用捲曲(這將是我最喜歡的解決方案),或者我怎麼能FTP只有一個區段在shell腳本中使用保持登錄?

我知道如何執行一組FTP命令和檢索響應,但對於遞歸上市,它必須是多了幾分動感......

感謝您的幫助!

回答

-1

,如果你只是想創建的所有文件和文件夾的列表,你可以使用ssh代替。像這樣的東西(但檢查正確使用的文檔)

$ ssh [email protected] "ls -R /path" 
+1

這並沒有真正回答這個問題。我們不知道他有外殼訪問。這應該是一個評論。 – 2014-09-04 02:21:34

0

你可以連接到FTP服務器的方式,它從標準輸入接受命令並寫入到標準輸出。創建兩個命名管道(「fifos」,man mkfifo),將ftp命令的stdin和stdout重定向到其中的一個。然後,您可以將命令寫入stdin-connected-fifo,並從stdout-fifo中讀取它們(例如,bash的read)。然後使用結果來查看你需要發送另一個列表命令的地方(並打印它或任何你想做的事情)

總之:不是什麼bash腳本適合:)(直到你找到一個工具做什麼要通過自身的課程)

9

的命令實際上ncftpls -R是。它將遞歸列出一個ftp文件夾中的所有文件。

3

如果有可能,儘量usign lftp的腳本:

# lftp script "myscript.lftp" 
open your-ftp-host 
user username password 
cd directory_with_subdirs_u_want_to_list 
find 
exit 

u需要接下來的事情是bash腳本來運行這個lftp的命令,並將其寫入到文件:

#!/bin/bash 
lftp -f myscript.lftp > myOutputFile 

myOutputFile現在包含完整的目錄轉儲。

+0

'lftp'解決方案實際上可以與Windows FTP服務器一起使用,即使支持'ls -R'刪除:http://support.microsoft.com/kb/2007929。謝謝 ! – malat 2014-10-30 10:44:27

3

只是爲了總結到目前爲止,別人怎麼說。如果你想寫一個可移植的shell腳本,它可以作爲批處理文件,則需要使用lftp的解決方案,因爲some FTP server可能無法實現ls -R。只需在下面的例子在FTP服務器的實際IP地址替換123.456.789.100:

$ lftp -c "open 123.456.789.100 && find -l && exit" > listing.txt 

man頁的lftp的,轉到find部分:

清單目錄中的文件(當前目錄默認) 遞歸。這可以幫助缺乏ls -R支持的服務器。你可以重定向這個命令的輸出。

但是,如果你有辦法找出遠程FTP服務器,無論是否實現了ls -lR適當的支持,那麼一個更好的(=更快)的解決方案將是:

$ echo ls -lR | ftp 123.456.789.100 > listing.txt 

僅供參考如果我執行第一個命令(lftp + find),則需要0m55.384s才能檢索完整列表,而如果執行第二個命令(ftp + ls-R),則需要0m3.225s。