📼

bsdtarをUbuntuで使う

2022/01/09に公開

bsdtarとは

FreeBSD由来のlibarchiveを利用するtarコマンド。FreeBSD の tar がすごいで紹介されているように、様々なアーカイブに対応している。

Ubuntuでのインストール

libarchive-tools パッケージ に含まれており、

$ sudo apt install libarchive-tools

でインストールできる。

$ dpkg -L libarchive-tools | grep bin/
/usr/bin/bsdcat
/usr/bin/bsdcpio
/usr/bin/bsdtar

手元で確認に使っている環境は

$ grep PRETTY_NAME /etc/os-release
PRETTY_NAME="Ubuntu 20.04 LTS"

アーカイブの展開

zip

手元にあった jar を展開してみる。

$ file /usr/share/java/libintl.jar
/usr/share/java/libintl.jar: Java archive data (JAR)

GNU tar だとエラーになり展開できない。

$ 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.
$ tar xvf /usr/share/java/libintl.jar
tar: This does not look like a tar archive
tar: Skipping to next header
tar: Exiting with failure status due to previous errors
$ echo $?
2

unzip コマンドだと以下のようにして展開できる。

$ unzip /usr/share/java/libintl.jar
Archive:  /usr/share/java/libintl.jar
   creating: META-INF/
  inflating: META-INF/MANIFEST.MF
  inflating: gnu/gettext/GettextResource.class

bsdtar だと展開できる。

$ 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
$ bsdtar xvf /usr/share/java/libintl.jar
x META-INF/
x META-INF/MANIFEST.MF
x gnu/gettext/GettextResource.class
$ echo $?
0

ar

libc.aを展開してみる。

$ file /usr/lib/x86_64-linux-gnu/libc.a
/usr/lib/x86_64-linux-gnu/libc.a: current ar archive

GNU tar だとエラーになり展開できない。

$ tar xf /usr/lib/x86_64-linux-gnu/libc.a
tar: This does not look like a tar archive
tar: Skipping to next header
tar: A lone zero block at 608
tar: Exiting with failure status due to previous errors
$ echo $?
2

ar コマンドだと以下のようにして展開できる。

$ ar x /usr/lib/x86_64-linux-gnu/libc.a
$ echo $?
0

bsdtar だと、エラーメッセージが出る(何故?)が、展開はできた。

$ bsdtar xf /usr/lib/x86_64-linux-gnu/libc.a
bsdtar: Removing leading '/' from member names
.: Can't remove already-existing dir
.: Can't remove already-existing dir
bsdtar: Error exit delayed from previous errors.
$ echo $?
1
$ ls | head
a64l.o
abort.o
abs.o
accept4.o
accept.o
access.o
acct.o
addmul_1.o
add_n.o
adjtime.o

なお、同じく ar アーカイブである debファイルならエラーなしで展開できた。

$ file /var/cache/apt/archives/python3.10_3.10.1-1+focal3_amd64.deb
/var/cache/apt/archives/python3.10_3.10.1-1+focal3_amd64.deb: Debian binary package (format 2.0), with control.tar.xz, data compression xz
$ bsdtar xvf /var/cache/apt/archives/python3.10_3.10.1-1+focal3_amd64.deb
x debian-binary
x control.tar.xz
x data.tar.xz
$ echo $?
0

アーカイブの作成

GNU tar の a オプション便利を参考にアーカイブを作成してみる。

$ mkdir foo
$ echo baz > foo/bar
$ for x in 7z tar tar.bz2 tar.gz tar.xz tar.Z zip; do bsdtar cfa foo.${x} foo; done
$ 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 03:22:35 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

GNU tar だと対応していなかった .7z .zip も 7-zip archive, Zip archive として作成できている。

Discussion