![如何拥有具有完整路径的存档,但不创建 tarbomb?](https://linux22.com/image/222299/%E5%A6%82%E4%BD%95%E6%8B%A5%E6%9C%89%E5%85%B7%E6%9C%89%E5%AE%8C%E6%95%B4%E8%B7%AF%E5%BE%84%E7%9A%84%E5%AD%98%E6%A1%A3%EF%BC%8C%E4%BD%86%E4%B8%8D%E5%88%9B%E5%BB%BA%20tarbomb%EF%BC%9F.png)
我想创建一个保留原始文件绝对路径信息的存档文件,但我一直无法找到一种不会导致 tarbomb 的方法来执行此操作?
具体而言,假设我想制作一个包含这些文件的(压缩)存档文件(*.zip 或 *.tgz 或其他任何文件)
/usr/share/foo/bsd/config.yaml
/usr/share/foo/linux/config.yaml
/usr/share/foo/windows/config.yaml
...我想保留原始文件完整路径中编码的信息。
理想情况下,当提取存档时,它应该生成以下文件
./<BASENAME>/usr/share/foo/bsd/config.yaml
./<BASENAME>/usr/share/foo/linux/config.yaml
./<BASENAME>/usr/share/foo/windows/config.yaml
...其中<BASENAME>
代表存档文件的基本名称(不包括其扩展名)。
我可以做到这一点的一种方法是创建./<BASENAME>/usr/share/foo/{bsd,linux,windows}
目录,在这些目录中创建到相应文件的符号链接,创建目录的存档./<BASENAME>
(包括可能需要的任何标志,以确保在将项目添加到目录时取消引用符号链接) archive),并rm -rf ./<BASENAME>
在存档文件准备好后运行。
有没有更省力的方法?
答案1
我的方法类似于以下内容:
tar -Pczvf ./test.tgz /usr/share/foo/{bsd,linux,windows}
使用 GNU TAR:
-P:绝对名称
-c:创建
-z:gzip 压缩
-v:详细输出
-f:存档的文件名
这将为您提供一个压缩存档,其中包含所包含文件的绝对路径。然后,您可以将存档提取到您想要使用的任何库中-C
,或者再次使用以下命令将文件提取到绝对位置-P
:
tar -xzvf ./test.tgz -C $BASENAME
tar -Pxzvf ./test.tgz
答案2
您可以尝试使用相对路径,例如:
cd /
tar cvf path/to/tar_file.tar usr/share/foo/{bsd,linux,windows}/config.yaml
所以你的路径没有前导斜杠。