如何在不创建子目录的情况下从tar归档文件中提取文件?

问题描述:

我有一个压缩的tar归档文件,我想从归档文件的深处提取一个文件到当前的工作目录。如何在不创建子目录的情况下从tar归档文件中提取文件?

有没有比tar好的东西,或者一种没有目录组件的方式来提取它?

我做得像现在这样的权利:

tar xfvz $file -C $destination $folder"/"$file 
cd $destination"/"$folder 
mv $file ../$file 
rm -r $folder 

但我有时删除错误$folder。我的存档是:mytar.tar.gz。 里面我有myfolder/mysecondfolder/hello.txt

我想在当前目录中提取myfolder/mysecondfolder/hello.txt作为hello.txt

+0

你知道你想提取的文件名'.tar'?假设你只想从档案中提取这个文件? – Inian

+0

我知道文件的名称是的,但我可能不知道文件夹名称或文件夹的数量,然后我才能到达文件 – Kryze

+0

而且您只希望该文件没有解析的文件夹级别? 'tar'不能以这种方式工作,直到文件存在的级别的内部文件夹被留下。您必须稍后手动删除文件夹。你能否更新问题中的存档并再次声明你的异常? – Inian

只需在压缩包名称后给出文件的完整存储路径即可。

例子:假设你想从2.pdf文件test.tar.gz

tar -zxvf test.tar.gz 2.pdf

+0

它不工作,则该命令从存档 焦油解压文件夹太-xf 1481648808.tar.gz 1481648808/hello.txt.gpg LS 1481648808 1481648808.tar.gz 该文件夹是从我的tar.gz – Kryze

+0

提取@Kryze:如果你正在寻找的文件存在于'x/y/file'里面,文件夹'x/y'停留在后面,你提出的问题不能在一个简单的tar提取中实现。 – Inian

+0

@Kryze更新,现在这个作品。文件2。pdf在与test.tar.gz相同的目录中提取。 – akskas

如果GNU焦油是可用的,你可以使用--strip-components参数:

#!/bin/bash 
file_to_extract=myfolder/mysecondfolder/hello.txt 
depth=$(awk -F/ '{print NF-1}' <<< "$file_to_extract") 
tar zxvf mytar.tar.gz --strip-components="$depth" "$file_to_extract" 

从人焦油:

--strip-components=NUMBER 
     strip NUMBER leading components from file names on extraction 

来源:https://www.linuxquestions.org/questions/linux-newbie-8/extracting-tar-gz-files-in-current-directory-689243/#postmenu_3368879


更短的解决方案是使用--transform选项,建议由托比·斯佩特:

tar zxvf mytar.tar.gz --transform='s,.*/,,' myfolder/mysecondfolder/hello.txt 
+0

您能向我解释“深度”行吗?谢谢 – Kryze

+0

@Kryze:'--strip-components'参数需要知道有多少主要的目录需要去除,所以我们使用awk来计算文件路径中的斜线数。 – user000001

+1

你可以避免使用'--transform =',。*/,,''或类似的东西(这也是一个GNU扩展)来计算'/'。 –