簡體   English   中英

如何wget目錄的更新文件

[英]How to wget the more recent file of a directory

我想編寫一個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的輸出會更好,但是包的名稱可能與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來獲取它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM