有没有办法在不解压缩的情况下添加或更新 tar.gz(tgz) 中的文件?

Is there a way to add or update file in tar.gz(tgz) without decompress?

我正在寻找更新 tgz 文件的方法。 我知道我可以通过解压缩、将文件插入目录并重新压缩来更新 tgz 文件。 但是我不想在我的光盘中创建解压缩文件。

Tar 有 'r' 选项(--append)什么附加文件到存档的末尾但是当我使用 tar 和 'r' 选项时,控制台记录'cannot update compressed archive.'、'Error is not recoverable: exiting now.'

如果不可能,我也没办法,如果有办法,请告诉我。

我根据 Basile Starynkevitch 的评论修改了我的问题。

这是测试命令。

tar -rf myComppressedFile.tgz insert.txt

结果

tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now

vim myCompressedFile.tgz

./file1.txt
./file2.txt
./file3.txt
./directory1/
./directory1/file4.txt

我要更新什么

./file1.txt
./file2.txt
./file3.txt
./directory1/
./directory1/file4.txt
./insert.txt <<<< I want to add like this file

我的 tgz 文件大约有 100 多兆字节。

Is there a way to add or update file in tar.gz(tgz) without decompress?

不行,没办法。

因为 gzip 的压缩发生在整个 tar 存档上(制作 tar 球之后)。使用 strace(1) (so read syscalls(2)) or ltrace(1)

观察 tar 命令的运行时行为

阅读 tar(1). Study the source code of GNU tar (it is free software) 的文档。

在我的 Debian/Sid/x86-64 上,libc6-dev 软件包提供 /usr/include/tar.h header。我邀请您查看那个 header 文件,它描述了 tar 个球的格式。

考虑使用其他方法:一些sqlite database, using postgresql or mongodb or GDBM, some afio archive (where each file is perhaps compressed before archiving it). See also the tardy实用程序。

I'm looking for a way to update tgz file

为什么?

您是否考虑过使用 version control on the underlying files before their archival with tar? Something like git

But I do not want decompressed file was created in my disk.

为什么?

解压后的文件可能是临时文件....

当然,如果您处理几兆字节的数据或几 PB 的数据,则需要采用不同的方法。当然,如果您正在开发关键的嵌入式应用程序(例如医疗设备、行星际卫星软件、DO-178C 软件系统),情况可能会有所不同。

有很多 trade-offs 需要考虑(包括金钱和开发时间以及数据丢失或损坏的存档的经济影响以及有关存档的法律法规和它的数据完整性:在 flight recorder 中,您应该确保飞机坠毁后数据可读)。

My tgz file is about more 100 megabytes.

这很小,并且实际上适合(对于 2020 年的大多数 Linux 系统,甚至是便宜的 RaspBerryPi) in the page cache。您可能会使用一些文件系统保存在 RAM 中(例如 tmpfs