zipをファイルシステムに抽出せずにtarに変換する方法はありますか?

zipをファイルシステムに抽出せずにtarに変換する方法はありますか?

zipまず、一時ディレクトリに抽出せずにアーカイブをtarアーカイブに変換する方法はありますか? (そして私だけtarのOR実装を作成せずunzip

ベストアンサー1

これで、PyPIでインストール可能なコマンドとして使用できるようになりました。この記事の最後をご覧ください。


これを行う「標準」ユーティリティはわかりませんが、この機能が必要なときに最初にディスクに何も抽出せずにZIPからBzip2圧縮tarアーカイブに圧縮するために、次のPythonスクリプトを作成しました。

#! /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(tuple(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.zipxyz.tar.bz2.

Bzip2圧縮出力は通常zipファイルよりはるかに小さいです。なぜなら、後者は複数のファイルに対して圧縮モードを使用しないからです。ただし、Bzip2ファイルでエラーが発生した場合は、後続のファイルを修復する可能性が低くなります。

出力を圧縮したくない場合は、コードから削除してください:bz2.bz2


pipPython3環境にインストールした場合は、次のことができます。

pip3 install ruamel.zip2tar

上記のタスクを実行するコマンドラインユーティリティを取得しますzip2tar(免責事項:私はこのパッケージの作成者です)。

おすすめ記事