我本人希望自己解决这个问题,但似乎我已经陷入了第一道障碍,因为我无法解读其他选项,也不知道我读过的其他选项。
我希望访问托管如下的数据库文件(即hhsuite_dbs
是包含多个数据库的文件夹)
http://wwwuser.gwdg.de/~compbiol/data/hhsuite/databases/hhsuite_dbs/pdb70_08Oct15.tgz
他们会定期更新这些数据库,因此我想下载最新版本。我的计划是通过cron
运行一个bash脚本,很可能是每月一次(尽管我还没有解决任务的调度问题)。
我相信数据库每两周刷新一次,所以如果我的脚本每月运行,我可以期待有一个新版本。然后我将运行需要数据库的下游程序。
我的问题是,如何检索这个(为了更加精细一点,我可能希望能够检查远程文件的名称或内容是否已更改,以避免在不必要的情况下进行大量下载) ?是查询文件名称的最佳方法,还是上次修改日期的文件属性(假设它们也可能更改文件的命名语法?)。对于我天真的大脑,pdb70
(我认为我可以依赖于文件名中的某些东西)然后用wget
拉下来,这是迄今为止我想出的所有内容。< / p>
编辑 刚刚发生的另一个令人困惑的问题是,我想要的文件不一定是文件夹中的 最新版本(如还有其他类型的数据库),但是,我需要最新版本的,在这种情况下,pdb70
数据库。
我到目前为止看过的解决方案已提到weex
,lftp
,curlftpls
但所有这些似乎都建议我没有的服务器的登录/密码/我需要通过网络下载它。我也看到了rsync
的提及,但粗略的阅读似乎人们正在为FTP使用而转向它。
答案 0 :(得分:1)
你的方式有很多障碍。
我的第一个建议是,不是自己获取文件名,而是使用wget
镜像目录,该目录应该已经安装在您的Ubuntu系统上,让wget
找出要下载的内容。
base="http://wwwuser.gwdg.de/~compbiol/data/hhsuite/databases/hhsuite_dbs/"
cd /some/place/safe/
wget --mirror -nd "$base"
新文件将在“安全”目录中创建。
但这只会让你成为你的镜子。你仍然追随“最新”文件。
幸运的是,wget设置了它下载的文件的日期戳,如果可以的话。因此,在镜像之后,您可能会执行以下操作:
newestfile=$(ls -t /some/place/safe/pdb70*gz | head -1)
请注意,如果文件名中有换行符,则会失败。
另一种可能性是检查当前文件列表与最后一个文件列表之间的差异。像这样:
#!/bin/bash
base="http://wwwuser.gwdg.de/~compbiol/data/hhsuite/databases/hhsuite_dbs/"
cd /some/place/safe/
wget --mirror -nd "$base"
rm index.html* *.gif # remove debris from mirroring an index
ls > /tmp/filelist.txt.$$
if [ -f /tmp/filelist.txt ]; then
echo "Difference since last check:"
diff /tmp/filelist.txt /tmp/filelist.txt.$$
fi
mv /tmp/filelist.txt.$$ /tmp/filelist.txt
您可以解析差异输出(man diff
以获取更多选项)以确定添加了哪个文件。
当然,使用这样的解决方案,您可以每天运行脚本,并希望在准备好的一天内下载新更新,而不是两周后。关于--mirror
的好处是它不会下载已经存在的文件。
哦,我还没有测试过我在这里写的东西。那是一个巨大的文件。