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