2012-09-18 83 views
3

我正在編寫shell腳本,我想從FTP下載最新的創建文件。 我想下載特定文件夾的最新文件。以下是我的代碼。但它是下載文件夾的所有文件,而不是最新的文件。shell腳本從FTP下載最新文件

ftp -in ftp.abc.com << SCRIPTEND 
user xyz xyz 
binary 
cd Rpts/ 
mget ls -t -r | tail -n 1 
quit 
SCRIPTEND 

請幫我解決這個問題嗎?

回答

1

嘗試使用wget或lftp實用程序,而不是比較文件時間/日期和AFAIR它的目的是ftp腳本。切換到SSH/rsync的,如果可能的話,你可以閱讀一些關於lftp的,而不是rsync的位置:

https://serverfault.com/questions/24622/how-to-use-rsync-over-ftp

也許最簡單的方法是最後一個版本的服務器端鏈接到「當前」,始終得到文件指向。如果你不是服務器的管理員,你需要用日期/時間列出所有文件,獲取信息,解析它,決定哪一個是最新的,同時服務器上的狀態可以改變,並且你發現自己更多比它的價值更復雜的解決方案。

問題是,「ls」以某種方式排序輸出,並且時間可能不是默認值。有開關可以對它進行排序基於修改時間,但即使服務器在ls -t上使用OK進行響應,您也無法確定它是否真的支持排序,它可以忽略所有開關並始終返回相同的列表,這就是爲什麼管理員通常使用「當前」鏈接(ln -s)。如果沒有「當前」,爲了確保你有正確的文件,無論如何你需要解析列表(ls -al)。

http://www.catb.org/esr/writings/unix-koans/shell-tools.html

+0

哎,請你給我提供這個 – mahesh

+0

上有serverfault.com問題 –

+0

我已經看到,代碼示例我新的code..as ..但這些是從FTP下載的代碼..但我可以做到這一點與此腳本以及..但概率是下載最新文件 – mahesh

1

看代碼,行

mget ls -t -r | tail -n 1

不會做你的想法。它實際上抓取所有ls -t的輸出,然後tail處理mget的輸出。你可以用

mget $(ls -t -r | tail -n 1)

替換這一行,但我不知道如果ftp會支持這樣的電話...

嘗試使用比ftp其他FTP客戶端。例如,curlftpfscurlftpfs.sourceforge.net可用是一個很好的候選人,因爲它允許您將FTP掛載到目錄,就好像它是本地文件夾,然後對那裏的文件(包括find,grep等)運行不同的命令。 Take a look at this article

這樣,由於輸出來自一個本地命令,你會更確定ls -t返回一個正確排序的列表。

順便說一句,使用ls -t | head -1ls -t -r | tail -1稍微複雜一些。他們產生相同的結果,但爲什麼反過來和從尾巴抓,當你可以抓住頭:)

如果你使用curlftpfs那麼你的腳本會是這樣的(假設服務器ftp.abc.com和用戶xyz與密碼xyz)。

mkdir /tmp/ftpsession 
curlftpfs ftp://xyz:[email protected] /tmp/ftpsession 
cd /tmp/ftpsession/Rpts 
cp -Rpf $(ls -t | head -1) /your/destination/folder/or/file 
cd - 
umount /tmp/ftpsession 
+0

感謝您對curlftpfs的暗示! – Gerfried

1

我的解決辦法是這樣的:

curl 'ftp://server.de/dir/'$(curl 'ftp://server.de/dir/' 2>/dev/null | tail -1 | awk '{print $(NF)}')