如何使用wget获取目录中最新的文件

4
3个回答

8
文件似乎是按发布日期排序的,每个新版本都是一个新条目,名称反映版本号更改,因此检查特定文件的时间戳似乎是不必要的。此外,您提供了一个“目录”的链接,其实是一个网页。据我所知,在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%自动化的。有几种方法可以避免这个问题,但如果没有监督,你可能会遇到上述问题。

太好了。这太棒了。能否在脚本中添加最后一个条目以安装下载的文件? - ECII

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文件输出到标准输出并过滤它来实现。

好的。谢谢。我该如何修改脚本以便文件可以安装(我假设使用dpkg)?我对bash不熟悉。 - ECII

1
< p > -N 选项告诉 wget 只有在文件是更新版本时才获取它。但是,仅使用 wget,您无法像下载某个远程目录中的所有文件的最新文件那样执行操作。您需要编写一个 bash 脚本或其他脚本来执行检查,然后调用 wget 抓取它。


你能给我指一些参考资料,来编写检查的Bash脚本吗? - ECII
不好意思,我不知道。另外一个问题是,如果远程服务器不允许目录索引,你将会遇到麻烦。如果你能够索引一个目录,那么你就可以轻松确定哪个是最新的文件,并使用wget检索它。否则,你将不得不绕过无法访问带有修改日期/时间的目录列表的限制。 - L0j1k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接