如何修改gzipped tar文件中的文件?

2 投票
2 回答
7351 浏览
提问于 2025-04-16 09:28

我想写一个(最好是用Python)脚本,来修改一个压缩的tar文件里的某个文件内容。这个脚本需要在FreeBSD 6及以上版本上运行。

基本上,我需要做以下几件事:

  • 打开tar文件
  • 如果tar文件里面有_MY_FILE_这个文件:
    • 如果_MY_FILE_里面有一行符合/RE/的内容:
    • 在这行后面插入一行新的内容
  • 把修改后的内容重新写入tar文件,同时保留所有的元数据,除了文件大小

我需要对很多文件重复这个操作。

Python的tarfile模块似乎无法在压缩状态下打开tar文件进行读写,这也可以理解。不过,我也找不到一种方法可以在修改后复制这个tar文件。

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

2 个回答

1

我觉得没有简单的方法可以单独删除一个文件。你可以很容易地提取一个或所有文件,然后再添加需要的文件。

我认为唯一的方法是:

  • 用 Python 的 tarfile 打开压缩文件,然后重命名它。
  • 为原来的文件名创建一个空的压缩文件副本。
  • 重新添加所有文件,在重新添加之前先修改你需要更改的那个文件。
  • 在重新创建时,确保读取的格式是正确的。

    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

5

不要把tar文件当成一个可以随意读写的数据库——它不是。tar文件其实就是把多个文件拼在一起。如果你想修改中间的某个文件,就得把后面的所有文件都重新写一遍。(对于某些大小的文件,你可能可以利用块填充的技巧)

你需要做的是逐个处理tar包里的文件,把修改过的文件复制到一个新的tar包里。Python的tarfile模块可以让这个过程变得简单。你可以通过把旧的TarInfo对象里的属性复制到新的对象上,来保留这些属性。

撰写回答