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
(免責事項:私はこのパッケージの作成者です)。
答え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を使用してアーカイブをある形式から別の形式に変換できます。。