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


18

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

如果我解压缩它:tar -xf myArchive123.tar.gz我得到该helloWorld文件夹:

ls 
myArchive123.tar.gz
helloWorld 

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

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

能做到吗?

  • 我永远不知道档案里面有什么。可能是文件夹,可能是许多文件。
  • 如果tar无法做到,我可以使用其他工具。
  • 可以将更长的表格转换成脚本就可以了

编辑
同时,我入侵了一个似乎可以完成工作的脚本。(请参见下面我发布的答案)。如果可以改善,请随时发表评论/其他答案。最主要的是,它应可包装成单线包装,例如:

extract <file>

1
存档中是否总是只包含一个文件夹?
Mark Plotnick


我不知道提取时里面有什么。这也不应该取决于存档中的内容。如果是文件夹,则将其中的文件夹解压缩。如果是文件,则解压缩所有文件。
Leo Ufimtsev

同时,我整理了一个脚本(见下文)。我只能在两天内接受答案。
Leo Ufimtsev

归档文件是否会在顶层包含多个文件夹?
Mark Plotnick

Answers:


10

使用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最后一个后缀
NAME = $ {STRIP%.tar} #strip .tar后缀(如果存在)
tar -xf“ $ 1” --xform =“ s | ^ | $ NAME / | S” #run命令

这接近于我想要的,但我希望能够将其打包成类似以下内容:extract <file>
Leo Ufimtsev

这是越野车,它停在第一个点。例如,我有一个像这样的文件:eclipse-SDK-4.5M6-linux-gtk-x86_64.tar.gz我希望输出不带.tar.gz的文件,但我会得到eclipse-sdk-4
Leo Ufimtsev 2015年

在上面的脚本中,我删除了扩展名,如果找到了“ tar”,则将其进一步删除。
Leo Ufimtsev

通常,具有许多类型的档案。我希望能有一个快速的班轮,我想也许我错过了一些论据标志。但是,似乎没有微不足道的解决方案吗?
Leo Ufimtsev

好东西。这有效,并且比我编写的脚本短。真好!
Leo Ufimtsev

7

好吧,您至少可以分几个步骤进行操作。如果你做了

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

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


3

编辑

可接受的答案短于以下答案。(做同样的事情,但通常越短越好)。


最终,我为自己动手编写了一个脚本。它适用于.tar .tar.gz和.gz

#!/bin/sh
#usage:
# nameOfScript myArchive.tar.gz
# nameOfScript myArchive.gz
# nameOfScript myArchive.tar
#
# Result:
# myArchive   //folder
fileName="${1%.*}" #extracted filename

#handle the case of archive.tar.gz
trailingExtension="${fileName##*.}"
if [ "$trailingExtension" == "tar" ]  
then
    fileName="${fileName%.*}"  #remove trailing  tar.
fi

mkdir "$fileName"
tar -xf "$1" --strip-components=0 -C "$fileName"

用法:

   nameOfScript archive.tar.gz 
   ls 
    archive
   cd archive 
   ls 
    <archive content>

注意,此解决方案能够在文件名中包含点。例如Eclipse-4.5M-SDK.tar.gz。

我将脚本保存在git repo中。有关最新版本,请参见:https : //github.com/LeoUfimtsev/ldts/blob/master/pathscripts/leo-tar-here


2

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

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

与您的文件:

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

1
但这前提是您知道档案中的内容
Leo Ufimtsev 2015年

例如,如何在不知道存档内容的情况下将其转换为单行脚本?
Leo Ufimtsev

没错 正如我在这里写的那样,这只是一种可能的解决方案……
svq 2015年

那和--strip-compoments = 0 myArchive123之间有什么区别?
Leo Ufimtsev

1
并且--strip-components=0只需从路径中删除第一个目录名称,并使用-C选项将已归档的文件存储到新目录中。
svq 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.