如何在不创建子目录的情况下从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
。
只需在压缩包名称后给出文件的完整存储路径即可。
例子:假设你想从2.pdf
文件test.tar.gz
:
tar -zxvf test.tar.gz 2.pdf
如果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
更短的解决方案是使用--transform
选项,建议由托比·斯佩特:
tar zxvf mytar.tar.gz --transform='s,.*/,,' myfolder/mysecondfolder/hello.txt
您能向我解释“深度”行吗?谢谢 – Kryze
@Kryze:'--strip-components'参数需要知道有多少主要的目录需要去除,所以我们使用awk来计算文件路径中的斜线数。 – user000001
你可以避免使用'--transform =',。*/,,''或类似的东西(这也是一个GNU扩展)来计算'/'。 –
你知道你想提取的文件名'.tar'?假设你只想从档案中提取这个文件? – Inian
我知道文件的名称是的,但我可能不知道文件夹名称或文件夹的数量,然后我才能到达文件 – Kryze
而且您只希望该文件没有解析的文件夹级别? 'tar'不能以这种方式工作,直到文件存在的级别的内部文件夹被留下。您必须稍后手动删除文件夹。你能否更新问题中的存档并再次声明你的异常? – Inian