圧縮ファイルのダウンロードと解凍を一気に行う (wget・curl・tar)
Bash において、wget や curl で圧縮ファイルをダウンロードして、それを 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ファイルをダウンロード・解凍する - 指定のディレクトリ配下に
.tar.gzファイルをダウンロード・解凍する .tar.gzファイルをダウンロード・解凍してすぐ Bash スクリプトとして実行する.zipファイルをダウンロード・解凍する- よく使いそうなオプション
- 参考文献
カレントディレクトリに .tar.gz ファイルをダウンロード・解凍する
wget・curl どちらでも同じように処理できる。コレで、example.tar.gz という圧縮ファイルは残さずに、解凍した中身のファイルだけを保存できる。
$ wget http://example.com/example.tar.gz -O - | tar xvf -
$ curl http://localhost/test.tar.gz | tar xvf -
wgetの場合、-O -でダウンロードしたファイルを標準出力に吐けるcurlはデフォルトでダウンロードしたファイルを標準出力に吐くので、特にオプションなし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 コマンドは標準入力からファイルを受け取っての解凍ができないのだ。そこで、いくつかのやり方を紹介する。
- MacOS に同梱されている
bsdtarだと、前述のtarコマンドと同じ要領で Zip ファイルが解凍できる。bsdtar xvf -と書けば良い- MacOS の
tarコマンドはbsdtarのエイリアスになっているので、Mac 環境だけでいえば前述のtarコマンドがそのまま動く - Ubuntu であれば
apt install bsdtarでインストールできる $ wget http://example.com/example.tar.gz -O - | bsdtar xvf -$ curl http://localhost/test.tar.gz | bsdtar xvf -
- MacOS の
- Java をインストールしていて
jarコマンドが存在すれば、jarコマンドで標準入力から受け取った Zip ファイルを解凍できる$ wget http://example.com/example.zip -O - | jar xv$ curl http://example.com/example.zip | jar xv- 解凍したファイルを標準出力に流すことはできず、解凍したファイルがディレクトリ配下に展開される
busyboxに内蔵されているbusybox unzipコマンドだと、標準入力からファイルを受け取って解凍できる- Ubuntu だと
apt install busyboxでインストールできる $ wget http://example.com/example.zip -O - | busybox unzip -$ curl http://example.com/example.zip | busybox unzip -busybox unzip -pオプションで解凍したファイルを標準出力に吐けるので、コレを使えば実行まで一気に出来る$ wget http://example.com/example.zip -O - | busybox unzip - -p | bash$ curl http://example.com/example.zip | busybox unzip - -p | bash
- Ubuntu だと
gunzipおよびgzip -dコマンドで、ファイルを解凍して標準出力に吐くことは出来た$ wget http://localhost/test.zip -O - | gunzip | bash$ wget http://localhost/test.zip -O - | gzip -d | bash$ curl http://localhost/test.zip | gunzip | bash$ curl http://localhost/test.zip | gzip -d | bash
funzipコマンドは標準入力からファイルを受け取って標準出力に吐ける$ wget http://localhost/test.zip -O - | funzip | bash$ curl http://localhost/test.zip | funzip | bash
ファイルを解凍して保存したいなら、jar か busybox unzip が扱いやすいだろう。
ファイルを解凍してその場で実行するなら、Linux に標準搭載されているであろう gzip -d・gunzip・funzip でまかなえる。これらは標準出力に吐くだけなので、> ./dest.txt といった形でファイルに吐き出すことはできる。
一番汎用性が高く手っ取り早いのは、bsdtar を Linux 環境にインストールしてしまうのが良いだろう。解凍したファイルを保存することも、標準出力に流すこともできる。
よく使いそうなオプション
その他使いそうなオプションを書いておく。
wgetのメッセージを非表示にする :-qcurlのメッセージを非表示にする :-sScurlでリダイレクトに対応する :-Ltarのメッセージを非表示にする :vを付けない
以上。