我想编写一个(最好是Python)脚本来修改gzipped tar 文件中一个文件的内容。该脚本必须在 FreeBSD 6+ 上运行。
基本上,我需要:
我将对很多文件重复此操作。
Python 的
tarfile
模块似乎无法在压缩时打开 tar 文件进行读/写访问,这具有一定的意义。但是,我也找不到复制经过修改的 tar 文件的方法。
有没有简单的方法可以做到这一点?
不要将 tar 文件视为可以读/写的数据库——事实并非如此。 tar 文件是文件的串联。 要修改中间的文件,您需要重写该文件的其余部分。 (对于特定大小的文件,您也许可以利用块填充)
您想要做的是逐个处理 tarball 文件,将文件(经过修改)复制到新的 tarball 中。 Python tarfile 模块应该可以轻松做到这一点。 您应该能够通过将属性从旧 TarInfo 对象复制到新对象来保留这些属性。
我没有看到删除单个文件的简单方法。 您可以轻松提取一个或全部文件,然后添加所需的任何文件。
我认为唯一的方法是:
重新创建时阅读时请务必重置正确的格式
tarfile.USTAR_FORMAT POSIX.1-1988 (ustar) 格式。 tarfile.GNU_FORMAT GNU tar 格式。 tarfile.PAX_FORMAT POSIX.1-2001 (pax) 格式。 tarfile.DEFAULT_FORMAT
我认为 David Phillips 已经回答得很好,但这里有一些示例代码:
with tarfile.open(input_tar_file, 'r:gz') as input_archive:
with tarfile.open(output_tar_file, 'w:gz') as output_archive:
for name in input_archive.getnames():
info = input_archive.getmember(name)
file = input_archive.extractfile(name)
print(f'loaded {name} size {info.size}')
output_archive.addfile(info, file)
此代码将
input_tar_file
复制到 output_tar_file
。如果您想修改某些内容,请从 print()
调用开始。在那里,您可以检查输入、丢弃它、根据需要修改它。
注意事项:
info.size
中,另一个位置由 file
流的长度隐式给出。