圧縮ファイルのダウンロードと解凍を一気に行う (wget・curl・tar)

Bash において、wgetcurl で圧縮ファイルをダウンロードして、それを tar とかで解凍して、それから実行したり指定の場所に配置したり、みたいな処理はよくあると思う。

愚直にスクリプトを書くと、

# 圧縮ファイルをダウンロードして、解凍して、圧縮ファイルは削除して…
wget http://example.com/example.tar.gz
tar xvf ./example.tar.gz
rm ./example.tar.gz

# 解凍して取り出したファイルを処理して…
mv ./example.bash /PATH/TO/DIST-DIRECTORY/

…みたいな感じで、複数のコマンドになってしまって面倒臭い。

そこで、こうしたよくある処理をワンライナーで行うスクリプトをチートシート的に紹介する。

目次

カレントディレクトリに .tar.gz ファイルをダウンロード・解凍する

wgetcurl どちらでも同じように処理できる。コレで、example.tar.gz という圧縮ファイルは残さずに、解凍した中身のファイルだけを保存できる。

$ wget http://example.com/example.tar.gz -O - | tar xvf -
$ curl http://localhost/test.tar.gz | tar xvf -

指定のディレクトリ配下に .tar.gz ファイルをダウンロード・解凍する

tar-C オプションを使うと、解凍したファイルをどのディレクトリに置くか指定できる。

$ wget http://example.com/example.tar.gz -O - | tar xvf - -C /PATH/TO/directory/
$ curl http://localhost/test.tar.gz | tar xvf - -C /PATH/TO/directory/

.tar.gz ファイルをダウンロード・解凍してすぐ Bash スクリプトとして実行する

example.bash.tar.gz といった圧縮ファイルを解凍すると、中に example.bash という一つのファイルが入っている、というテイ。

tar-O オプションを使うと、解凍した内容を標準出力に吐けるので、コレを bash にパイプして流してやれば良い。同じ要領で、python でも perl でも何でもできると思う。

$ wget http://example.com/example.bash.tar.gz -O - | tar xvf - -O | bash
$ curl http://example.com/example.bash.tar.gz | tar xvf - -O | bash

.zip ファイルをダウンロード・解凍する

.tar.gz ファイルの扱いについてはこんな感じだが、.zip ファイルは少々扱いづらい。

GNU tar だと .zip は解凍出来ず、unzip コマンドは標準入力からファイルを受け取っての解凍ができないのだ。そこで、いくつかのやり方を紹介する。

ファイルを解凍して保存したいなら、jarbusybox unzip が扱いやすいだろう。

ファイルを解凍してその場で実行するなら、Linux に標準搭載されているであろう gzip -dgunzipfunzip でまかなえる。これらは標準出力に吐くだけなので、> ./dest.txt といった形でファイルに吐き出すことはできる。

一番汎用性が高く手っ取り早いのは、bsdtar を Linux 環境にインストールしてしまうのが良いだろう。解凍したファイルを保存することも、標準出力に流すこともできる。

よく使いそうなオプション

その他使いそうなオプションを書いておく。

以上。

参考文献