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(免責事項:私はこのパッケージの作成者です)。

答え2

このtarコマンドはファイルシステムを処理します。入力はファイルのリストであり、ファイルシステムから読み取られます(多くのメタデータを含む)。コマンドがtarそれを読むには、zipファイルをファイルシステムとして提供する必要があります。

仮想ファイルシステム - AVFSどのプログラムでも、標準のファイルシステムインタフェースを介してアーカイブまたは圧縮ファイルの内部を表示できます。ヒューズ

その中に詳細な情報があります。avfs-fuseを読む少し残った分散 持つ バッグそれのために。

AVFSがインストールされている場合は、次のことができます。

mountavfs
cd ~/.avfs/path/to/somefile.zip#
tar -cvf /path/whatever.tar .

AVFSは、tarが選択したファイルの所有権など、zipから見つからないファイルシステムに関するすべての情報を入力します。

答え3

Linuxには、stdinとstdoutを介してパイプを操作するための素晴らしいツールセットがあります。

unzip -p ./fzs-2015-03-18.zip | bzip2 > fzs-2015-03-18.bz

一時ファイルが作成されたことを確認する

ps -ef | grep unzip
auser      44260    6666  3 11:18 pts/2    00:00:02 unzip -p ./fzs-2015-03-18.zip
auser      44434   44370  0 11:19 pts/1    00:00:00 grep --color=auto unzip


lsof -p 44260
COMMAND   PID  USER   FD   TYPE DEVICE  SIZE/OFF    NODE NAME
unzip   44260 auser  cwd    DIR  259,6      4096 3015712 /home/auser/Documents/shares/logs
unzip   44260 auser  rtd    DIR  259,5      4096       2 /
unzip   44260 auser  txt    REG  259,5    178072  680357 /usr/bin/unzip
unzip   44260 auser  mem    REG  259,5   3040368  744942 /usr/lib/locale/locale-archive
unzip   44260 auser  mem    REG  259,5   2146832  666811 /usr/lib/libc-2.31.so
unzip   44260 auser  mem    REG  259,5     74440  751069 /usr/lib/libbz2.so.1.0.8
unzip   44260 auser  mem    REG  259,5    203056  665072 /usr/lib/ld-2.31.so
unzip   44260 auser    0u   CHR  136,2       0t0       5 /dev/pts/2
unzip   44260 auser    1w  FIFO   0,13       0t0  436437 pipe
unzip   44260 auser    2u   CHR  136,2       0t0       5 /dev/pts/2
unzip   44260 auser    3r   REG  259,6 513348882 3015900 /home/auser/Documents/shares/logs/fzs-2015-03-18.zip



ps -ef | grep bzip2
auser      44262    6666 99 11:18 pts/2    00:06:42 bzip2
auser      45111   44370  0 11:25 pts/1    00:00:00 grep --color=auto bzip2

⟩ lsof -p 44262
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bzip2   44262 auser  cwd    DIR  259,6     4096 3015712 /home/auser/Documents/shares/logs
bzip2   44262 auser  rtd    DIR  259,5     4096       2 /
bzip2   44262 auser  txt    REG  259,5    38744  655763 /usr/bin/bzip2
bzip2   44262 auser  mem    REG  259,5  2146832  666811 /usr/lib/libc-2.31.so
bzip2   44262 auser  mem    REG  259,5    74440  751069 /usr/lib/libbz2.so.1.0.8
bzip2   44262 auser  mem    REG  259,5   203056  665072 /usr/lib/ld-2.31.so
bzip2   44262 auser    0r  FIFO   0,13      0t0  436437 pipe
bzip2   44262 auser    1w   REG  259,6 97325056 3015902 /home/auser/Documents/shares/logs/fzs-2015-03-18.bz
bzip2   44262 auser    2u   CHR  136,2      0t0       5 /dev/pts/2

パイプ|ほど436437 pipe

とても簡単です。

これをstdinを介してパイプ入力を可能にする他のユーティリティbzip2に置き換えることができます。gzip

zipファイルには何千ものテキストファイルが含まれています。

答え4

libarchiveの使用bsdtar

bsdtar -zcf file.tar.gz @file.zip

~から手動:

tarはストリームアーカイブを作成して操作します。実装はtar、pax、cpioから抽出できます。圧縮、jar、ar、xar、rpm、7-zip、およびISO 9660 CDROMイメージを作成できます。アスファルト、pax、cpio、ar、zip、7-zipおよびsharアーカイブ。

@archive
(モードcのみr)指定されたアーカイブが開き、そのエントリが現在のアーカイブに追加されます。簡単な例を挙げると、

tar -c -f - newfile @original.tar

newfile ファイルとすべてのエントリを含む新しいアーカイブを標準出力に書き込みますoriginal.tar。対照的に、

tar -c -f - newfile original.tar

2 つの項目しかない新しいアーカイブを作成します。同様に、

tar -czf - --format pax @-

標準入力からアーカイブを読み取り(対応する形式は自動的に決定されます)、標準出力からgzipで圧縮されたpax形式のアーカイブに変換します。 このように、tarを使用してアーカイブをある形式から別の形式に変換できます。

関連情報