从FTP下载最新文件的Shell脚本

3

我第一次编写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?


3个回答

1

我的解决方案是这样的:

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

1

尝试使用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


我使用的ls命令是为了获取最新的文件名,但是我不知道为什么在FTP的情况下它不起作用。 - mahesh
所以根据您最新的更新,我需要列出所有文件并使用一些逻辑找到最新的文件。但是我不能有类似我提到的脚本吗? - mahesh
在那个文件夹里,我们的经理每天都会放置报告文件。因此,目前我正在使用一个FTP客户端来连接并下载最新的报告文件。但现在我想将其制作成脚本,这样只需要执行脚本就可以了。 - mahesh
文件名不固定,因为经理使用不同类型的名称创建文件名,并且不能要求他指定特定格式的文件名... 当我开始时,我认为这是一个简单的过程,但我卡在这里了。 - mahesh
让我们在聊天中继续这个讨论。点击此处进入聊天室 - Piotr Wadas
显示剩余5条评论

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挂载到一个目录中,就像它是一个本地文件夹,然后在那里运行不同的命令(包括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

感谢您提供curlftpfs的提示! - ESP32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接