📼
bsdtarをUbuntuで使う
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