如何wget更新的目录文件

我想编写一个bash脚本来下载和安装最新的每日编译程序(RStudio)。 是否有可能让wget只下载目录中的最新文件http://www.rstudio.org/download/daily/desktop/ ?

这些文件似乎是按发布日期排序的,每个新发布的版本都是一个新名称,反映了版本号的变化,因此检查某个文件的时间戳似乎是不必要的。

此外,您提供了一个“目录”的链接,这本质上是一个网页。 AFAIK,http中没有这样的一个目录(这是一个在给定地址为你提供数据的通信协议)。 你看到的是一个由服务器生成的列表,类似于Windows文件夹的易用性,尽管它仍然是一个网页。

说了那么,你可以刮那个网页。 下面的代码在列表上的第一个位置下载文件(假设第一个是最近的):

 #!/bin/bash wget -q -O tmp.html http://www.rstudio.org/download/daily/desktop/ubuntu64/ RELEASE_URL=`cat tmp.html | grep -m 1 -o -E "https[^<>]*?amd64.deb" | head -1` rm tmp.html # TODO Check if the old package name is the same as in RELEASE_URL. # If not, then get the new version. wget -q $RELEASE_URL 

现在您可以根据当地的最新版本进行检查,并在必要时进行安装。

编辑:更新的版本,它执行简单的版本检查并安装软件包。

 #!/bin/bash MY_PATH=`dirname "$0"` RES_DIR="$MY_PATH/res" # Piping from stdout suggested by Chirlo. RELEASE_URL=`wget -q -O - http://www.rstudio.org/download/daily/desktop/ubuntu64/ | grep -m 1 -o "https[^\']*"` if [ "$RELEASE_URL" == "" ]; then echo "Package index not found. Maybe the server is down?" exit 1 fi mkdir -p "$RES_DIR" NEW_PACKAGE=${RELEASE_URL##https*/} OLD_PACKAGE=`ls "$RES_DIR"` if [ "$OLD_PACKAGE" == "" ] || [ "$OLD_PACKAGE" != "$NEW_PACKAGE" ]; then cd "$RES_DIR" rm -f $OLD_PACKAGE echo "New version found. Downloading..." wget -q $RELEASE_URL if [ ! -e "$NEW_PACKAGE" ]; then echo "Package not found." exit 1 fi echo "Installing..." sudo dpkg -i $NEW_PACKAGE else echo "rstudio up to date." fi 

还有一些评论:

  • 该脚本保留一个本地res/ dir与最新版本(正好一个文件),并将其名称与新抓取的软件包名称进行比较。 这是肮脏的(有一个文件并不意味着它已被成功安装在过去)。 最好是解析dpkg -l的输出,但是包的名字可能与被删除的名称略有不同。
  • 你仍然需要输入sudo的密码,所以它不会是100%自动的。 有几种方法可以解决这个问题,尽管如果没有监督,你可能会遇到前面提到的问题。

@Richard Pumps的一个稍微干净的版本:

 RELEASE_URL=$(wget -q -O - http://www.rstudio.org/download/daily/desktop/ubuntu64 | grep -o -m 1 "https[^\']*" ) # check version from name ... wget ${RELEASE_URL} 

这可避免通过将html文件输出到stdout并对其进行过滤来创建tmp文件。

-N选项将告诉wget只有在文件是新版本时才能得到一个文件。 但是,单独使用wget,不能像在一些远程目录中下载所有文件的最新文件一样广泛。 你需要写一个bash脚本或者一些检查的东西,然后调用wget来抓取它。