tar 提取到具有相同基本名称的目录中?

Leo*_*sev 23 tar

我有一个像myArchive123.tar.gz. 它里面包含一个文件夹,如helloWorld

如果我提取它:tar -xf myArchive123.tar.gz我得到helloWorld文件夹:

ls 
myArchive123.tar.gz
helloWorld 
Run Code Online (Sandbox Code Playgroud)

我希望输出的名称与文件名减去 .tar.gz 扩展名相同。IE:

tar <magic paramaters> myArchive123.tar.gz 
ls 
 myArchive123.tar.gz
 myArchive123
cd myArchive123
ls 
  helloWorld
Run Code Online (Sandbox Code Playgroud)

这能做到吗?

  • 我永远不知道档案里有什么。可能是一个文件夹,也可能是许多文件。
  • 如果 tar 无法做到,我可以使用其他工具。
  • 我可以用更长的形式,可以变成脚本

编辑
同时,我自己编写了一个似乎可以完成工作的脚本。(请参阅下面我发布的答案)。如果可以改进,请随时发表评论/其他答案。最重要的是它应该可以打包成一个单线,如:

extract <file>
Run Code Online (Sandbox Code Playgroud)

Hri*_*dam 16

$ tar -xf myArchive123.tar.gz --one-top-level
Run Code Online (Sandbox Code Playgroud)

--one-top-level [=DIR]
将所有文件提取到 DIR 中,或者,如果不带参数使用,则提取到由存档的基本名称命名的子目录中(减去 --auto-compress 可识别的标准压缩后缀)。


Eri*_*ouf 11

好吧,您至少可以通过几个步骤来完成。如果你做了

mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>
Run Code Online (Sandbox Code Playgroud)

这将完成任务,尽管可能还有更紧凑的答案。


don*_*sti 11

使用gnu tar,您可以使用--xform(或--transform)/prefix/在每个文件名前加上:

tar -xf myArchive.tar.gz --xform='s|^|myArchive/|S'
Run Code Online (Sandbox Code Playgroud)

注意这里没有领导/prefix/sed与表达两端S排除从文件名转换的符号链接的目标。
要对其进行测试(试运行):

tar -tf myArchive.tar.gz --xform='s|^|myArchive/|S' --verbose --show-transformed-names
Run Code Online (Sandbox Code Playgroud)

为了让您开始,这里有一个非常简单的脚本,您可以将其调用为extract <file>

STRIP=${1%.*} #strip 最后一个后缀
NAME=${STRIP%.tar} #strip .tar后缀,如果存在
tar -xf "$1" --xform="s|^|$NAME/|S" #run 命令