4

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

4

3 回答 3

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% 自动进行。有几种方法可以解决这个问题,但如果没有监督,您可能会遇到前面提到的问题。
于 2013-02-23T22:50:11.633 回答
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 文件。

于 2013-02-23T23:07:42.383 回答
1

-N选项将告诉 wget 仅获取较新版本的文件。然而,单独使用 wget,你不能做像下载某个远程目录中所有文件的最新文件那样广泛的事情。您需要编写一个 bash 脚本或其他东西来进行检查,然后调用 wget 来获取它。

于 2013-02-23T11:45:20.073 回答