将文件添加/更新到现有的tar.gz归档文件?


73

有没有一种方法可以在tar.gz归档文件中添加/更新文件?基本上,我有一个存档,其中包含一个文件,/data/data/com.myapp.backup/./files/settings.txt我想从存档中拉出该文件(已完成),并在完成编辑后将其推回到存档中。我该怎么做?是否因为.路径而有问题?


2
+1。这将使在OS X上的工作变得如此容易。目前,我必须手动清理所有隐藏文件.DS_Store的目录,然后重新压缩该目录。

Answers:


15

tar文件格式只是一系列文件和几个标头串联在一起。将其拆开,放入内容并放回原处并不是一件很复杂的工作。话虽如此,Jander描述了tar作为程序是如何不具有实用程序功能来执行此操作的,并且压缩还有其他复杂性,压缩前后必须同时进行更改。

但是,有工作所需的工具!至少有两个系统,使您可以将压缩的tar归档环回安装到文件夹上,然后在文件系统中进行更改。完成后,请卸载该文件夹,然后即可开始压缩存档。

第一个选择是FUSEarchivemount项目。这是有关的教程。您的系统可能已经具有FUSE,如果没有,则您的发行版应该有一个选项。

另一个选择是tarfs。它使用起来更简单,但是我听说它在破坏bzip2归档文件方面存在一些麻烦,因此您可以先对其进行彻底的测试。


1
我使用的是AVFS,它打包在Ubuntu和Debian中。您知道Archivemount和tarfs与AVFS相比如何吗?
吉尔斯(Gilles)

坦率地说,不,我不知道,尽管既然您提到了替代方案,我很想了解AVFS。我已经使用了archivemount和tarfs,但是从退役项目开始已经有很长时间了,并且不知道它们的当前状态。从那种经验中,我有点断定,即使实现完美,该想法在概念上也是错误的。
卡莱布(Caleb)

我看了一下archivemount的工作方式。它不会修改现有的.tar.gz文件,但是在卸载时,它将重命名原始文件并在其位置创建一个全新的tar文件。如果您希望获得良好的用户体验,那很好,但是如果您出于效率方面的考虑而避免重写整个存档,那将无济于事。
詹德

@Jander是为了指出这一点。我很确定它适用于所有压缩的归档安装选项。问题是文件的各个部分未压缩,整个文件的内部标头以及所有文件都已压缩,并且要提取其他内容,正如预期的那样,gzip必须在整个数据集上运行。没有一种方法可以在其中插入某些内容而不将其提取出来,然后重新运行压缩并重写整个数据文件。因此,我先前的评论在概念上是错误的解决方案。档案就是档案。
迦勒

43

要从存档中提取文件,可以使用tar xzf archive.tar.gz my/path/to/file.txt。请注意,文件路径中的目录也会被创建。使用tar t(即tar tzf archive.tar.gz)列出存档中的文件。

tar不支持“就地”更新文件。但是,即使文件的路径与归档中已存在的文件的路径相同,也可以将其添加到归档的末尾。在这种情况下,文件的两个副本都将在存档中,而以后添加的文件将覆盖较早的文件。为此使用的命令是tar r(或tar u仅添加比归档文件新的文件)是要使用的命令。该.路径不应该是一个问题。

但是有一个陷阱:您不能添加到压缩的存档中。因此,您必须执行以下操作:

gunzip archive.tar.gz
tar rf archive.tar data/data/com.myapp.backup/./files/settings.txt
gzip archive.tar

这可能不是您想听到的,因为这意味着两次重写整个存档。如果存档不是很大,最好解压缩整个内容,然后在编辑后重新解压缩。或者,您可以使用未压缩的存档。


该答案仅在涉及标准tar程序的情况下才是正确的。Tar作为文件格式实际上很容易访问。您可以轻松地编写脚本来自己更新内容,但是已经有其他工具可以执行此操作
卡莱布

23
您也可以通过Unix方式执行此操作:gzip -dc archive.tar.gz | tar -r data/data/com.myapp.backup/./files/settings.txt | gzip >archive_new.tar.gz
Simon Richter,

2
IIRC,您可以简单地串联两个gzip文件。结果是一个较大的gzip压缩文件,其中包含两个未压缩的文件并置。
FUZxxl

解压缩文件后,是否可以使用--update标志?
pietro '10 -10-6

@FUZxxl +1提及了gzip串联
JohanBoulé18年

9

Tar最初是用于磁带的,因此在设计中并没有真正“替换”文件。但是,可以使用--delete从原始tar中删除文件,然后使用-u更新tar并重新添加文件。可能需要一点时间,因为tar需要在内部重新组织档案。


欢迎使用StackExchange!您的答案仅包含其他答案中已经提出的建议。回答之前,请阅读问题的其他答案,以避免重复。
JigglyNaga

1
我编辑了一下答案。我认为其他答案没有提到--delete
rleibman

-5

在我的Linux x86_64 GNU / Linux上执行该操作,我仅使用以下命令:

tar cvfpz /path/archive.tar -T list.txt

该命令导致/path使用文件中包含的list.txt文件列表创建压缩档案。


6
这将覆盖现有文件/path/archive.tar,而不是添加/更新该文件。
Anthon 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.