今回は、標準入力の内容を直接 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
めでたしめでたし。