4

プログラム (RStudio) の最新の毎日のビルドをダウンロードしてインストールする bash スクリプトを書きたいと思います。ディレクトリhttp://www.rstudio.org/download/daily/desktop/wgetにある最新のファイルのみをダウンロードするようにすることはできますか?

4

3 に答える 3

8

ファイルはリリース日順にソートされているようで、新しいリリースはそれぞれ、バージョン番号の変更を反映した新しい名前の新しいエントリであるため、特定のファイルのタイムスタンプをチェックする必要はないようです。

また、基本的に Web ページである「ディレクトリ」へのリンクを提供しました。私の知る限り、httpにはディレクトリのようなものはありません(これは、指定されたアドレスでデータを提供する通信プロトコルです)。表示されるのは、使いやすいように Windows フォルダーに似たサーバーによって生成されたリストですが、それでも Web ページです。

そうは言っても、そのWebページをスクレイピングできます。次のコードは、リストの最初の位置にあるファイルをダウンロードします (最初のファイルが最新のものであると仮定します)。

#!/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/、最新バージョン (正確に 1 つのファイル) のローカル ディレクトリを保持し、その名前を新しくスクレイピングされたパッケージ名と比較します。これは汚れています (ファイルがあるからといって、それが過去に正常にインストールされたことを意味するわけではありません)。の出力を解析した方がよいでしょうが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 を単独で使用すると、リモート ディレクトリにあるすべてのファイルの最新のファイルをダウンロードするような広範なことはできません。チェックを行い、それを取得するために wget を呼び出す bash スクリプトまたは何かを作成する必要があります。

于 2013-02-23T11:45:20.073 に答える