我是第一次编写 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
. 例如,curlftpfs
可在curlftpfs.sourceforge.net上找到一个很好的选择,因为它允许您将 FTP 挂载到一个目录,就好像它是一个本地文件夹一样,然后对那里的文件运行不同的命令(包括 find、grep 等) . 看看这篇文章。
这样,由于输出来自本地命令,您可以更确定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
我的解决方案是这样的:
curl 'ftp://server.de/dir/'$(curl 'ftp://server.de/dir/' 2>/dev/null | tail -1 | awk '{print $(NF)}')