💬

tar は圧縮形式を指定しなくても展開できる

2023/01/03に公開

tar は圧縮形式を指定しなくても展開できる

tar は最もよく使われるコマンドの一つですが、意外と知られていないことがあります。それは、展開するときに圧縮形式を指定しなくても展開できるということです。

今でも検索をすると、 tarを使ってファイルを展開するときに圧縮形式を指定しているようなものを見つけます。例えば次のようなコマンドラインです。

tar xzvf archive.tar.gz
tar xjvf archive.tar.bz2
tar xJvf archive.tar.xz

ところが広く使われている GNU tar (Linux) も、BSD tar (OSX) も、展開するときは圧縮形式を自動判別します。つまり、

tar xvf archive.tar.gz
tar xvf archive.tar.bz2
tar xvf archive.tar.xz

とするだけで、すべての形式を自動判別して展開します。また、ファイルの一覧を出力してほしくない時は

tar xf archive.tar.gz
tar xf archive.tar.bz2
tar xf archive.tar.xz

とすると画面上には何も出力せず展開してくれます。

このことは公式のドキュメントにも記載されています。

GNU tar の場合

Reading compressed archive is even simpler: you don't need to specify any additional options as GNU tar recognizes its format automatically.

圧縮されたアーカイブを読むのはより簡単です。GNU tar が自動的に形式を認識するので、追加のオプションを指定する必要はありません。

BSD tar の場合
代表例として -z を抜粋しますが、他の形式のオプションのところにも同様のことが書かれています。

-z, --gunzip, --gzip
(c mode only) Compress the resulting archive with gzip(1). In extract or list modes, this option is ignored. Note that, unlike other tar implementations, this implementation recognizes gzip compression automatically when reading archives.

-z
(cモードのみ) 生成されるアーカイブをgzip(1)で圧縮します。展開やリストモードでは、このオプションは無視されます。他のtarの実装と異なり、この実装ではアーカイブを読むときにgzip圧縮を自動的に認識します。

特にBSD tarの場合は明確に「無視する」と書いています。

機械に判別してもらえるものは機械に判別してもらいましょう。また、新しい圧縮形式 zstd では一文字のオプションがなく、--zstd と指定する必要がありますので、タイプ数が少ないコマンドに慣れることは損ではないと思います。

Discussion