使用 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 一样。当然可以将命令包装到 shell 脚本或 shell 函数中,但我想知道是否有一些内置BSD tar 会产生相同的结果,因此只需要一个命令?


背景:我想使用 BSD tar,因为 GNU tar 目前似乎不支持非 Linux 平台上的扩展属性,至少在 macOS 上通过 Homebrew 安装的 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 支持的某些存档格式的基名(去掉后缀)添加到提取的路径中。

相关内容