CUBE SUGAR CONTAINER

技術系のこと書きます。

標準入力の内容を直接 gzip で圧縮・解凍する

今回は、標準入力の内容を直接 gzip を使って圧縮したり解凍する方法について。 どうしてそんなことをするかというと、ディスクの消費を抑えるため。 一般的には一旦内容をファイルに書き出してから、それを圧縮・解凍すると思う。 ただ、圧縮しない状態で書き出すとローカルディスクの容量を圧迫するような状況が考えられる。 例えば分散ファイルシステムからデータを手元に持ってくるときなんかにありがち。

今回使った環境は次の通り。

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G1036
$ gzip --version
Apple gzip 264.50.1

ちなみに GNU gzip でも同じように動作する。

$ brew install gzip
$ gzip --version
gzip 1.8
Copyright (C) 2016 Free Software Foundation, Inc.
Copyright (C) 1993 Jean-loup Gailly.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

Written by Jean-loup Gailly.

標準入力の内容を圧縮する

今回は例として echo コマンドを使うことにする。 やることは単純で、コマンドの標準出力をパイプで gzip コマンドの標準入力につないでやる。 あとは gzip コマンドの -c オプションで圧縮した結果を標準出力に書き出すだけ。 ここではリダイレクトを使って greeting.txt.gz というファイルに保存した。

$ echo "Hello, World" | gzip -c > greeting.txt.gz

これなら圧縮した結果をファイルに書き出す以外にも色々と加工できる。

できあがったファイルは、ちゃんと gzip 形式になっている。

$ file greeting.txt.gz 
greeting.txt.gz: gzip compressed data, last modified: Sat Nov 18 08:12:22 2017, from Unix

標準入力の内容を解凍する

先ほどは圧縮したので、次は解凍する方法について。 やり方としては、ファイルの内容を cat コマンド経由で gzip コマンドの標準入力につないでやる。 あとは gzip コマンドの -d オプションで解凍処理を指定する。

$ cat greeting.txt.gz | gzip -d
Hello, World

ちゃんと圧縮前の内容が得られた。

もちろん今回の趣旨からは外れるけど、ファイルを指定して解凍しても構わない。

$ gzip -d greeting.txt.gz 
$ cat greeting.txt 
Hello, World

めでたしめでたし。