如何wget目录的更新文件

时间:2013-02-23 11:40:18

标签: linux bash wget

我想写一个bash脚本,下载并安装最新的每日程序版本(RStudio)。是否可以让wget仅下载目录http://www.rstudio.org/download/daily/desktop/中的最新文件?

3 个答案:

答案 0 :(得分:8)

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

此外,您还提供了指向“目录”的链接,该目录基本上是一个网页。 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/目录(确切地说 一个文件)并将其名称与新删除的包名称进行比较。 这很脏(有文件并不意味着它已经存在 成功安装过去)。解析它会更好 dpkg -l的输出,但包的名称可能略有不同 不同于刮掉的。
  • 您仍然需要输入 sudo的密码,因此不会100%自动生成。有几个 解决这个问题的方法,虽然没有监督,你可能会遇到 先前陈述的问题。

答案 1 :(得分:5)

@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文件。

答案 2 :(得分:1)

-N选项会告诉wget只有获取文件才能获得更新的版本。但是,单独使用wget,您无法像下载某个远程目录中所有文件的最新文件那样广泛。你需要编写一个bash脚本或者进行检查的东西,然后调用wget来抓取它。

相关问题