【问题标题】:How to wget the more recent file of a directory如何获取目录的最新文件
【发布时间】:2013-02-23 11:40:17
【问题描述】:

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

【问题讨论】:

    标签: linux bash wget


    【解决方案1】:

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

    此外,您还提供了指向“目录”的链接,该目录本质上是一个网页。 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
    

    还有几个cmets:

    • 脚本保留了一个本地的res/ 目录和最新版本(确切地说 一个文件)并将其名称与新抓取的包名称进行比较。 这很脏(有一个文件并不意味着它已经 过去安装成功)。最好解析一下 dpkg -l 的输出,但包的名称可能略有不同 与刮掉的不同。
    • 您仍需要输入 sudo 的密码,所以它不会是 100% 自动的。有几个 解决这个问题的方法,虽然没有监督你可能会遇到 之前提到的问题。

    【讨论】:

    • 太棒了。这是太棒了。是否可以在脚本中添加最后一个条目以安装下载的文件?
    【解决方案2】:

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

    【讨论】:

    • 太棒了。谢谢。如何修改脚本以便随后安装文件(我假设使用 dpgk)?我对 bash 不熟悉
    【解决方案3】:

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

    【讨论】:

    • 您能否指出任何对执行检查的 bash 脚本进行编码的参考资料?
    • 我不知道,抱歉。您将遇到的另一个问题是远程服务器是否不允许目录索引。如果您能够索引一个目录,那么您将能够轻松确定哪个是最新文件,并因此使用 wget 检索它。否则,您将不得不解决无法访问修改日期/时间的目录列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2013-02-09
    • 1970-01-01
    • 2014-08-27
    相关资源
    最近更新 更多