圧縮ファイルのダウンロードと解凍を一気に行う (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
のメッセージを非表示にする :-q
curl
のメッセージを非表示にする :-sS
curl
でリダイレクトに対応する :-L
tar
のメッセージを非表示にする :v
を付けない
以上。