プログラム (RStudio) の最新の毎日のビルドをダウンロードしてインストールする bash スクリプトを書きたいと思います。ディレクトリhttp://www.rstudio.org/download/daily/desktop/wget
にある最新のファイルのみをダウンロードするようにすることはできますか?
3 に答える
ファイルはリリース日順にソートされているようで、新しいリリースはそれぞれ、バージョン番号の変更を反映した新しい名前の新しいエントリであるため、特定のファイルのタイムスタンプをチェックする必要はないようです。
また、基本的に 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% 自動ではありません。これを回避する方法はいくつかありますが、監視がなければ、前述の問題が発生する可能性があります。
@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 を単独で使用すると、リモート ディレクトリにあるすべてのファイルの最新のファイルをダウンロードするような広範なことはできません。チェックを行い、それを取得するために wget を呼び出す bash スクリプトまたは何かを作成する必要があります。