现在,可以从PyPI将其作为可安装命令使用,请参阅本文结尾。
我不知道这样做的任何“标准”实用程序,但是当我需要此功能时,我编写了以下Python脚本,从ZIP压缩到Bzip2压缩的tar存档,而没有先提取任何内容到磁盘:
#! /usr/bin/env python
"""zip2tar """
import sys
import os
from zipfile import ZipFile
import tarfile
import time
def main(ifn, ofn):
with ZipFile(ifn) as zipf:
with tarfile.open(ofn, 'w:bz2') as tarf:
for zip_info in zipf.infolist():
#print zip_info.filename, zip_info.file_size
tar_info = tarfile.TarInfo(name=zip_info.filename)
tar_info.size = zip_info.file_size
tar_info.mtime = time.mktime(list(zip_info.date_time) +
[-1, -1, -1])
tarf.addfile(
tarinfo=tar_info,
fileobj=zipf.open(zip_info.filename)
)
input_file_name = sys.argv[1]
output_file_name = os.path.splitext(input_file_name)[0] + '.tar.bz2'
main(input_file_name, output_file_name)
只需将其保存到zip2tar
并使其可执行或保存到zip2tar.py
并运行即可python zip2tar.py
。提供ZIP文件名作为脚本的参数,输出文件xyz.zip
名将为xyz.tar.bz2
。
Bzip2压缩的输出通常比zip文件小得多,因为zip文件不对多个文件使用压缩模式,但是如果Bzip2文件中的某些内容有误,则恢复以后的文件的可能性也较小。
如果您不希望压缩输出,请从代码中删除:bz2
和.bz2
。
如果您已pip
安装在python3环境中,则可以执行以下操作:
pip3 install ruamel.zip2tar
获得zip2tar
执行上述操作的命令行实用程序(免责声明:我是该软件包的作者)。