🐸

GNU tar の a オプション便利

2021/03/18に公開1

↓こんな感じに a を付けて実行すると拡張子を見て勝手にアーカイブの圧縮方法を変えてくれるのね。

tar cfa foo.tar     foo/
tar cfa foo.tar.gz  foo/
tar cfa foo.tar.bz2 foo/
tar cfa foo.tar.xz  foo/
tar cfa foo.tar.Z   foo/
tar cfa foo.zip     foo/
tar cfa foo.7z      foo/

確認のために ls してみるとファイルサイズが異なることから別ファイルが出来てるのが分かる。

$ ls -l foo.*
-rw-r--r-- 1 kawaz staff 1032 2021-01-22 03:12:46.131 foo.7z
-rw-r--r-- 1 kawaz staff 1800 2021-01-22 03:13:32.540 foo.tar.Z
-rw-r--r-- 1 kawaz staff 1114 2021-01-22 03:01:41.769 foo.tar.bz2
-rw-r--r-- 1 kawaz staff  923 2021-01-22 03:01:44.975 foo.tar.gz
-rw-r--r-- 1 kawaz staff  908 2021-01-22 03:08:26.381 foo.tar.xz
-rw-r--r-- 1 kawaz staff 4032 2021-01-22 03:10:19.265 foo.zip

ちなみに展開するときは tar x にぶち込めば(こちらはファイル名ではなく)ファイルヘッダを見て、適切に処理してくれる。

便利。

Discussion

Yoichi NakayamaYoichi Nakayama

TopicにGNUとあるのですが、Ubuntu の GNU tar で試すと .7z と .zip は非対応で、tarとして処理されていました。

$ file foo.*
foo.7z:      POSIX tar archive (GNU)
foo.tar:     POSIX tar archive (GNU)
foo.tar.bz2: bzip2 compressed data, block size = 900k
foo.tar.gz:  gzip compressed data, from Unix, original size modulo 2^32 10240
foo.tar.xz:  XZ compressed data
foo.tar.Z:   compress'd data 16 bits
foo.zip:     POSIX tar archive (GNU)
$ tar --version
tar (GNU tar) 1.30
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by John Gilmore and Jay Fenlason.

bsdtar (libarchive-tools 所蔵) だと記事に書かれた通りうまくいきました。

$ file foo.*
foo.7z:      7-zip archive data, version 0.3
foo.tar:     POSIX tar archive
foo.tar.bz2: bzip2 compressed data, block size = 900k
foo.tar.gz:  gzip compressed data, last modified: Sun Jan  9 02:32:20 2022, from Unix, original size modulo 2^32 2560
foo.tar.xz:  XZ compressed data
foo.tar.Z:   compress'd data 16 bits
foo.zip:     Zip archive data, at least v2.0 to extract
$ bsdtar --version
bsdtar 3.4.0 - libarchive 3.4.0 zlib/1.2.11 liblzma/5.2.4 bz2lib/1.0.8 liblz4/1.9.2 libzstd/1.4.4