37 xz についてのまとめ

ずいぶん久しぶりに xz の相手をすることになったので、整理しておく。


(2022/9/7追記) 今回やろうとしていたのは .tar.xz というファイルから 必要なファイルを取り出すことだったので、 実は macOS に付属しているアーカイブユーティリティで用が足りるはずだった、 ということが分かったけれど、まあ整理しておくと何かの役に立つかもしれない。


古いメモ: 「xz (圧縮ソフト)」     (10年前に書いたこれで十分、という気もする)


xz/unxz は、ファイルの可逆圧縮・復元を行うためのソフトウェアである。 圧縮して出来たファイルのファイル名末尾は、標準で .xz となる。

macOS には含まれていないが、MacPorts や Homebrew で簡単にインストールできる、
MacPorts でインストール
sudo port install xz

以前から、UNIX には compress/uncompress というソフトウェアがあり (後継として gzip/gunzip, bzip2/bunzip2 があり)、 xz/unxz の使い方はそれと良く似ている。

compress/uncompress の説明     compress で圧縮すると元のファイル名の末尾に '.Z' をつけた名前になる (標準出力に出力するには -c とする)。 元に戻すには uncompress を用いる。

例えば diary0.tex と言うファイルを圧縮して元に戻すには、 次のようにする。
% ls -l diary0.tex
-rw-r--r--  1 mk  staff  12143  9  4 13:24 diary0.tex
% compress diary0.tex
% ls -l diary0.tex*
-rw-r--r--  1 mk  staff  7916  9  4 13:24 diary0.tex.Z
% uncompress diary0.tex.Z
% ls -l diary0.tex*
-rw-r--r--  1 mk  staff  12143  9  4 13:24 diary0.tex
compress/uncompress すると、元のファイルなくなってしまう。 圧縮すると、ファイルのサイズが 12143 → 7916 と小さくなり、 それが復元され、日時は保存されているのが分かる。

xz/unxz でやってみる     同様のことを xz/unxz で行ってみる。
% ls -l diary0.tex
-rw-r--r--  1 mk  staff  12143  9  4 13:24 diary0.tex
% xz diary0.tex
% ls -l diary0.tex*
-rw-r--r--  1 mk  staff  5424  9  4 13:24 diary0.tex.xz
% unxz diary0.tex.xz
% ls -l diary0.tex*
-rw-r--r--  1 mk  staff  12143  9  4 13:24 diary0.tex


ファイルの可逆圧縮・復元というと、zip を思い出す人が多いと想像する。 zip は圧縮だけでなく、 複数のファイルを1つにまとめるという書庫機能も持っている。 compress/uncompress も xz/unxz も書庫機能は持っていない。 書庫機能が必要な場合は、tar というコマンドを併用するのが普通である。

書庫(archive)機能は tar を併用して実現する なんとか.tar.Z というファイルは、
tar cf なんとか.tar かんとか
compress なんとか.tar
(“かんとか” のところは複数のファイル (ディレクトリィを含む) が指定できる)
として作られる。つまり、 最初の tar cf なんとか.tar かんとか で、 “かんとか” で指定した複数のファイルをまとめた “なんとか.tar” と言う書庫ファイルを作り、 それを compress で圧縮して “なんとか.tar.Z” ができる。

逆順に
uncompress なんとか.tar.Z
tar xf なんとか.tar
とすれば、元のファイルが取り出せる (extract する、という)が、 実はもっと便利な方法がある (tar xzf なんとか.tar.Z とする -- 後述する)。


compress/uncompress には gzip/gunzip という改良版があり、 現在でも良く使われている。

gzip/gunzip/zcat     gzip/gunzip は compress/uncompress と同様のやり方でも使える。
% ls -l diary0.tex*
-rw-r--r--  1 mk  staff  23006  9  4 13:21 diary0.tex
% gzip diary0.tex
% ls -l diary0.tex*
-rw-r--r--  1 mk  staff  10162  9  4 13:21 diary0.tex.gz
% gunzip diary0.tex.gz
% ls -l diary0.tex*
-rw-r--r--  1 mk  staff  23006  9  4 13:21 diary0.tex
ファイル名の末尾が (.Z ではなく) .gz となる他は、 compress/uncompress と良く似ている。 ファイルのサイズは compress で圧縮したときよりも小さくなっている。

ちなみに gunzip は compress で圧縮したファイルも復元できる。


gzip/gunzip/zcat をリリースした GNU Project では、 tar も機能強化されて、連携が容易になっている。
tar cf なんとか.tar かんとか
gzip なんとか.tar
とする替わりに z オプションというのが用意されて
tar cfz なんとか.tar.gz かんとか
とコマンド一発ですむようになった。

.tar.Z, .tar.gz からファイルを取り出す方にも z オプションが使える。実際
gunzip nantoka.tar.gz
tar xf nantoka.tar
とする代わりに
tar xzf nantoka.tar.gz
でファイルが取り出せる。compress で圧縮した .tar.Z についても
tar xzf nantoka.tar.Z
で済む。

(余談) ちなみに tar がそのように機能拡張される前(大昔)は
decompress -c nantoka.tar.Z | tar xf -
のようにしてファイルを取り出す人が多かった (decompress -c で復元結果を標準出力に出力し、 一方の tar では、 f - により標準入力 (-) から入力することにして、 両者をパイプでつないだ)。 なお、 zcat (gzcat) は decompress -c と同様のことをしてくれるコマンドで、 これを使うと
zcat nantoka.tar.Z  | tar xf -
zcat nantoka.tar.gz | tar xf -
のようなことができる。

bzip2/bunzip2/bzcat     gzip/gunzip/zcat に代わる bzip2/bunzip2/bzcat というのがある。 使い方は gzip/gunzip/zcat とほぼ同様である。 ファイル名の拡張子は .bz2 となる。

tar との連携では、z オプションの替わりに j オプションを使う。
tar cfj なんとか.tar.bz2 かんとか
tar xfj なんとか.tar.bz2


bzip とか 7zip というのもあるが省略する (私は使ったことがないです)。


それで… xz/unxz/xzcat の話に戻る。 tar との連携機能は J オプションを使えば良い。 例えば
tar xfJ mplus-TESTFLIGHT-063a.tar.xz


macOS のアーカイブユーティリティ (/System/Library/CoreServices/Applications/Archive Utility.app) は、 tar で書庫化していない、 単に xz で圧縮しただけのファイルはサポートしないが、 なぜか .tar.xz はサポートするようである。

繰り返しになるが: MacOS adds XZ-compression support


(2022/9/6) 忘れていたけど 「pigz (gzip を置き換えよう)」 というのがある。

桂田 祐史