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 支持的某些存档格式的基名(去掉后缀)添加到提取的路径中。