Linux 如何从tar存档中提取文件而不创建子目录?

Linux 如何从tar存档中提取文件而不创建子目录?,linux,bash,tar,Linux,Bash,Tar,我有一个压缩的tar档案,我想从档案深处提取一个文件到当前的工作目录 是否有比tar更好的方法,或者没有目录组件的方法来提取它 我现在正在做这样的事情: tar xfvz $file -C $destination $folder"/"$file cd $destination"/"$folder mv $file ../$file rm -r $folder 但有时我会删除错误的$文件夹 例如,我的归档文件是:mytar.tar.gz。 里面有myfolder/mysecondfolder

我有一个压缩的tar档案,我想从档案深处提取一个文件到当前的工作目录

是否有比tar更好的方法,或者没有目录组件的方法来提取它

我现在正在做这样的事情:

tar xfvz $file -C $destination $folder"/"$file
cd $destination"/"$folder
mv $file ../$file 
rm -r $folder
但有时我会删除错误的
$文件夹

例如,我的归档文件是:
mytar.tar.gz
。 里面有
myfolder/mysecondfolder/hello.txt


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

只需在tarball名称后给出文件的完整存储路径即可

示例:假设您需要来自
2.pdf
的文件
test.tar.gz


tar-zxvf test.tar.gz 2.pdf

如果GNU tar可用,您可以使用
--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"
资料来源:


一个较短的解决方案是使用
--transform
选项,如Toby Speight所建议:

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

您知道要从
.tar
中提取的文件名吗?我假设您只想从存档中提取此文件?我知道文件名是的,但在到达文件之前,我可能不知道文件夹名或文件夹数,而您只想要该文件,而不需要解析的文件夹级别<代码>tar不能以这种方式工作,文件所在级别的内部文件夹被放在后面。以后必须手动删除这些文件夹。你能在问题中更新你的档案并再次陈述你的例外情况吗?如果我已经很好地理解了你的最后一句话,我会更新我的问题,顺便问一下,有没有可能用其他东西来摘录,谁能帮我实现这一点?像apt get DEpendency一样,您似乎只引用了不需要引用的部分:
tar xfvz“$archive”-C“$destination”“$folder/$file”
会更好。它不起作用,命令也从存档tar中提取文件夹-xf 1481648808.tar.gz 1481648808/hello.txt.gpg ls 1481648808 1481648808.tar.gz文件夹从我的tar中提取。gz@Kryze:如果您要查找的文件位于
x/y/file
中,则直接提取tar无法实现您的请求,文件夹
x/y
将保留。@Kryze已更新,现在可以使用了。文件2.pdf与test.tar.gz提取在同一目录中。我的文件在tar.gz中,在一个文件夹中,根据您的更新答案,我得到一个找不到的文件。您能给我解释一下“深度”行吗?Thanks@Kryze:
--strip components
参数需要知道要剥离多少个前导目录,因此我们使用awk计算文件路径中的斜杠数。通过使用
--transform='s,.*/,'
或类似的方法(这也是GNU扩展名),可以避免计算
/
tar zxvf mytar.tar.gz --transform='s,.*/,,' myfolder/mysecondfolder/hello.txt