3

我是第一次编写 shell 脚本,我想从 FTP 下载最新的创建文件。我想下载特定文件夹的最新文件。下面是我的代码。但它正在下载文件夹中的所有文件,而不是最新的文件。

ftp -in ftp.abc.com << SCRIPTEND
user xyz xyz
binary
cd Rpts/
mget ls -t -r | tail -n 1
quit
SCRIPTEND

请帮帮我好吗?

4

3 回答 3

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

于 2012-09-18T09:27:36.590 回答
1

看代码,行

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 -1ls -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
于 2012-09-18T11:17:17.957 回答
1

我的解决方案是这样的:

curl 'ftp://server.de/dir/'$(curl 'ftp://server.de/dir/' 2>/dev/null | tail -1 | awk '{print $(NF)}')
于 2014-10-10T07:34:13.353 回答