我第一次编写shell脚本,想从FTP下载最新的创建文件。我想要下载特定文件夹的最新文件。下面是我为此编写的代码。但它下载了文件夹中的所有文件而不是最新的一个。
ftp -in ftp.abc.com << SCRIPTEND
user xyz xyz
binary
cd Rpts/
mget ls -t -r | tail -n 1
quit
SCRIPTEND
help me with this, please?
我的解决方案是这样的:
curl 'ftp://server.de/dir/'$(curl 'ftp://server.de/dir/' 2>/dev/null | tail -1 | awk '{print $(NF)}')
尝试使用wget或lftp实用程序,它比较文件时间/日期,而且据我所知,其目的是FTP脚本编写。如果可能,请切换到ssh/rsync,您可以在此处阅读有关lftp而不是rsync的一些信息:
https://serverfault.com/questions/24622/how-to-use-rsync-over-ftp
可能最简单的方法是将服务器端的最新版本链接到“current”,并始终获取指向该文件的文件。如果您不是服务器的管理员,则需要列出所有带有日期/时间的文件,获取信息,解析它,决定哪个是最新的,同时服务器上的状态可能会发生变化,您会发现自己处于比它值得的更复杂的解决方案中。
关键是,“ls”以某种方式对输出进行排序,而时间可能不是默认值。有一些开关可以按修改时间进行排序,但即使服务器在ls -t上回应OK,您也无法确定它是否真正支持排序,它可能只是忽略所有开关并始终返回相同的列表,这就是为什么管理员通常使用“current”链接(ln -s)。如果没有“current”,为确保您拥有正确的文件,您仍然需要解析列表(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.sourceforge.net提供的curlftpfs
是一个很好的选择,因为它允许你将FTP挂载到一个目录中,就像它是一个本地文件夹,然后在那里运行不同的命令(包括find、grep等)。看看这篇文章。
这样,由于输出来自本地命令,你可以更加确信ls -t
返回了一个正确排序的列表。
ls -t | head -1
比使用ls -t -r | tail -1
要简单一些。它们产生相同的结果,但为什么要反转并从尾部获取,当你可以直接获取头部呢:)mkdir /tmp/ftpsession
curlftpfs ftp://xyz:xyz@ftp.abc.com /tmp/ftpsession
cd /tmp/ftpsession/Rpts
cp -Rpf $(ls -t | head -1) /your/destination/folder/or/file
cd -
umount /tmp/ftpsession