Isso agora está disponível como comando instalável do PyPI, veja o final deste post.
Eu não sei de nenhum utilitário "padrão" que o faça, mas quando eu precisei dessa funcionalidade eu escrevi o seguinte script Python para ir de ZIP para arquivos compactados tar do Bzip2 sem extrair nada para o disco primeiro:
#! /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)
Basta salvá-lo em zip2tar
e torná-lo executável ou salvá-lo em zip2tar.py
e executar python zip2tar.py
. Forneça o nome do arquivo ZIP como um argumento para o script, o nome do arquivo de saída para xyz.zip
será xyz.tar.bz2
.
A saída compactada do Bzip2 é normalmente muito menor que o arquivo zip, porque o último não usa padrões de compressão em vários arquivos, mas também há menos chances de recuperar arquivos posteriores se algo no arquivo Bzip2 estiver errado.
Se você não quiser que a saída seja compactada, remova :bz2
e .bz2
do código.
Se você tiver pip
instalado em um ambiente python3, poderá fazer:
pip3 install ruamel.zip2tar
para obter um utilitário de linha de comando zip2tar
fazendo o acima (disclaimer: Eu sou o autor desse pacote).