BSD tar を使用して、同じベース名を持つディレクトリにアーカイブを抽出します。

BSD tar を使用して、同じベース名を持つディレクトリにアーカイブを抽出します。

GNU tarを使用すると、アーカイブのデフォルト名にちなんで名前付きディレクトリにアーカイブの内容を抽出できます。

$ touch foobar
$ gnutar czf archive.tar.gz foobar
$ gnutar --one-top-level -xf archive.tar.gz
$ ls archive/foobar
archive/foobar

複数のコマンドを実行して、BSD tarを使用して同じ結果を得ることができます。

$ destdir=$(basename archive.tar.gz .tar.gz)
$ mkdir $destdir
$ bsdtar -C $destdir -xf archive.tar.gz
$ ls archive/foobar
archive/foobar

しかし、私は一つこのコマンドは GNU tar と同じです。もちろん、コマンドをシェルスクリプトやシェル関数でラップすることも可能ですが、どのような機能があるのか​​気になります。組み込みBSD tarは同じ結果を生成するので、1つのコマンドだけが必要ですか?


背景:GNU tarは現在、非Linuxプラットフォームでは拡張属性をサポートしていないようですので、BSD tarを使用したいと思います。少なくともHomebrewを介してインストールされているmacOS GNU tarは、現在の拡張属性サポートにコンパイルされていません。

答え1

あなたは自分の問題をほとんど解決しました。コードをわずかにパラメータ化すると、関数を生成してそれを自分.profileまたは他のbash起動スクリプトに配置できます。

guntar() {

destdir="$(basename "$1" .tar.gz)"
mkdir "$destdir"
bsdtar -C "$destdir" -xf "$1"
ls -l "$destdir"/

}

$ guntar archive.tar.gz 
total 1
-rw-------  1 jim  wheel  0 Jan 11 09:34 foobar

答え2

zshを使う:

() { bsdtar -"s|^|${${1:t}%.(tar*|t?z|xip|iso|7z)}/|' -xf $1; } path/to/some/file.tgz

ファイルパスを匿名関数に渡します。ここでは、オプションを使用して、-sbsdtarでサポートされている一部のアーカイブ形式のデフォルト名(サフィックスを除く)を抽出されたパスに追加します。

関連情報