如何修改 gzip 压缩的 tar 文件中的文件?

问题描述 投票:0回答:3

我想编写一个(最好是Python)脚本来修改gzipped tar 文件中一个文件的内容。该脚本必须在 FreeBSD 6+ 上运行。

基本上,我需要:

  • 打开 tar 文件
  • 如果 tar 文件中有 _MY_FILE_:
    • 如果 _MY_FILE_ 有匹配 /RE/ 的行:
    • 在匹配行后插入LINE
  • 将内容重写到 tar 文件中,保留除文件大小之外的所有元数据

我将对很多文件重复此操作。

Python 的

tarfile
模块似乎无法在压缩时打开 tar 文件进行读/写访问,这具有一定的意义。但是,我也找不到复制经过修改的 tar 文件的方法。

有没有简单的方法可以做到这一点?

python scripting automation tar
3个回答
6
投票

不要将 tar 文件视为可以读/写的数据库——事实并非如此。 tar 文件是文件的串联。 要修改中间的文件,您需要重写该文件的其余部分。 (对于特定大小的文件,您也许可以利用块填充)

您想要做的是逐个处理 tarball 文件,将文件(经过修改)复制到新的 tarball 中。 Python tarfile 模块应该可以轻松做到这一点。 您应该能够通过将属性从旧 TarInfo 对象复制到新对象来保留这些属性。


1
投票

我没有看到删除单个文件的简单方法。 您可以轻松提取一个或全部文件,然后添加所需的任何文件。

我认为唯一的方法是:

  • 使用 python tarfile 打开 tarfile,重命名它。
  • 为原始文件名创建一个重复的空 tar
  • 重新添加所有文件,更改您需要的文件后再重新添加
  • 重新创建时阅读时请务必重置正确的格式

    tarfile.USTAR_FORMAT POSIX.1-1988 (ustar) 格式。 tarfile.GNU_FORMAT GNU tar 格式。 tarfile.PAX_FORMAT POSIX.1-2001 (pax) 格式。 tarfile.DEFAULT_FORMAT

http://docs.python.org/library/tarfile.html


0
投票

我认为 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
    流的长度隐式给出。
© www.soinside.com 2019 - 2024. All rights reserved.