我正在編寫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
請幫我解決這個問題嗎?
我正在編寫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
請幫我解決這個問題嗎?
嘗試使用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
看代碼,行
mget ls -t -r | tail -n 1
不會做你的想法。它實際上抓取所有ls -t
的輸出,然後tail
處理mget
的輸出。你可以用
mget $(ls -t -r | tail -n 1)
替換這一行,但我不知道如果ftp
會支持這樣的電話...
嘗試使用比ftp
其他FTP客戶端。例如,curlftpfs
在curlftpfs.sourceforge.net可用是一個很好的候選人,因爲它允許您將FTP掛載到目錄,就好像它是本地文件夾,然後對那裏的文件(包括find,grep等)運行不同的命令。 Take a look at this article。
這樣,由於輸出來自一個本地命令,你會更確定ls -t
返回一個正確排序的列表。
順便說一句,使用ls -t | head -1
比ls -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
感謝您對curlftpfs的暗示! – Gerfried
我的解決辦法是這樣的:
curl 'ftp://server.de/dir/'$(curl 'ftp://server.de/dir/' 2>/dev/null | tail -1 | awk '{print $(NF)}')
哎,請你給我提供這個 – mahesh
上有serverfault.com問題 –
我已經看到,代碼示例我新的code..as ..但這些是從FTP下載的代碼..但我可以做到這一點與此腳本以及..但概率是下載最新文件 – mahesh