如何修改gzipped tar文件中的文件?
我想写一个(最好是用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
5
不要把tar文件当成一个可以随意读写的数据库——它不是。tar文件其实就是把多个文件拼在一起。如果你想修改中间的某个文件,就得把后面的所有文件都重新写一遍。(对于某些大小的文件,你可能可以利用块填充的技巧)
你需要做的是逐个处理tar包里的文件,把修改过的文件复制到一个新的tar包里。Python的tarfile模块可以让这个过程变得简单。你可以通过把旧的TarInfo对象里的属性复制到新的对象上,来保留这些属性。