tar 解压到具有相同基本名称的目录中?

tar 解压到具有相同基本名称的目录中?

我有一个压缩文件,例如myArchive123.tar.gz.在里面,它包含一个类似的文件夹helloWorld

如果我使用 提取它tar -xf myArchive123.tar.gz,我会得到该helloWorld文件夹​​:

ls 
myArchive123.tar.gz
helloWorld 

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

tar <magic paramaters> myArchive123.tar.gz 
ls 
 myArchive123.tar.gz
 myArchive123
cd myArchive123
ls 
  helloWorld

这可以做到吗?

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

编辑
与此同时,我给自己写了一个脚本,似乎可以完成工作(请参阅下面我发布的答案)。最主要的是它应该可以打包成一个单行代码,例如:

extract <file>

答案1

$ tar -xf myArchive123.tar.gz --one-top-level

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

答案2

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

tar -xf myArchive.tar.gz --xform='s|^|myArchive/|S'

请注意,没有前导/prefix/并且表达式以从文件名转换中排除符号链接目标sed结尾。 测试它(空运行):S

tar -tf myArchive.tar.gz --xform='s|^|myArchive/|S' --verbose --show-transformed-names

为了帮助您入门,这里有一个非常简单的脚本,您可以将其调用为extract <file>

STRIP=${1%.*} #去掉最后一个后缀
名称=${STRIP%.tar} #strip。柏油后缀(如果存在)
tar -xf "$1" --xform="s|^|$NAME/|S" #运行命令

答案3

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

mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>

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

答案4

另一种可能的解决方案是使用--transform选项:

tar -xzf ARCHIVE_NAME.tgz --transform="s/OLD_DIR_NAME/ARCHIVE_NAME/"

与您的文件:

tar -xzf myArchive123.tar.gz --transform="s/helloWorld/myArchive123/"

相关内容