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