如何拥有具有完整路径的存档,但不创建 tarbomb?

如何拥有具有完整路径的存档,但不创建 tarbomb?

我想创建一个保留原始文件绝对路径信息的存档文件,但我一直无法找到一种不会导致 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

所以你的路径没有前导斜杠。

相关内容