我第一次编写shell脚本,我想从FTP下载最新的创建文件。 我想下载特定文件夹的最新文件。下面是我的代码。但它下载的文件夹的所有文件都不是最新的。
ftp -in ftp.abc.com << SCRIPTEND
user xyz xyz
binary
cd Rpts/
mget ls -t -r | tail -n 1
quit
SCRIPTEND
请帮帮我吗?
答案 0 :(得分: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
答案 1 :(得分:1)
查看代码,行
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挂载到目录,就像它是本地文件夹一样,然后对那里的文件运行不同的命令(包括查找, 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: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
答案 2 :(得分:1)
我的解决方案是:
curl 'ftp://server.de/dir/'$(curl 'ftp://server.de/dir/' 2>/dev/null | tail -1 | awk '{print $(NF)}')