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.zip
はxyz.tar.bz2
.
Bzip2圧縮出力は通常zipファイルよりはるかに小さいです。なぜなら、後者は複数のファイルに対して圧縮モードを使用しないからです。ただし、Bzip2ファイルでエラーが発生した場合は、後続のファイルを修復する可能性が低くなります。
出力を圧縮したくない場合は、コードから削除してください:bz2
。.bz2
pip
Python3環境にインストールした場合は、次のことができます。
pip3 install ruamel.zip2tar
上記のタスクを実行するコマンドラインユーティリティを取得しますzip2tar
(免責事項:私はこのパッケージの作成者です)。