アーカイブファイルのリストをすぐに印刷します(アーカイブ全体を解凍せず)。

アーカイブファイルのリストをすぐに印刷します(アーカイブ全体を解凍せず)。

アーカイブの1つの問題.tar.gzは、アーカイブの内容を一覧表示しようとすると、コンピュータが実際に解凍されるため、ファイルが大きい場合は時間がかかることがあります。

.7z、、.rarなどの他のファイル形式には.zipこの問題はありません。内容の一覧表示には数分しかかかりません。

私の考えでは、これは.tar.gzアーカイブ形式の大きな欠点です。

だから実際には2つの質問があります。

  1. .tar.gzこれらの欠点にもかかわらず、人々はなぜそれをそれほど多く使用するのですか?
  2. 「インスタントコンテンツリスト」機能が必要な場合はどのようなオプションがありますか?(他のソフトウェアやツールを意味します)

ベストアンサー1

ここに妥協があることを理解することが重要です。

tar方法テープアーカイバー。テープは主に順次読み書きを行います。テープは今日はほとんど使用されていませんが、tarストリーミング形式でデータを読み書きする機能にはまだ使用されています。

あなたはできます:

tar cf - files | gzip | ssh host 'cd dest && gunzip | tar xf -'

zipそんなことやそんなことはできません。

zipまず、ローカルで検索可能なファイルに保存しないと、アーカイブの内容を一覧表示することもできません。図:

curl -s https://github.com/dwp-forge/columns/archive/v.2016-02-27.zip | unzip -l /dev/stdin

不可能。

コンテンツをすばやく読むにはzipインデックス作成が必要です。インデックスはファイルの先頭(この場合はストリームではなく通常のファイルにのみ書き込むことができます)またはファイルの最後に保存できます。つまり、アーカイバは、印刷する前にすべてのアーカイブを覚えておく必要があることを意味します。これは、切り捨てられたアーカイブを回復できないことを意味します。

これはまた、アーカイブメンバーを個別に圧縮しなければならないことを意味します。

同様の形式の別の欠点は、zipアーカイブが圧縮に関連しており、圧縮アルゴリズムを選択できないことである。 ( )、 、 を順番に使用し、新しいtar高性能圧縮アルゴリズムを設計してアーカイブを圧縮する方法を学びます。暗号化も同様です。今日、誰が暗号化を信頼していますか?compresstar.Zgzipbzip2xzzip

今、アーカイブの問題tar.gzは解凍しなければならないということではありません。解凍は通常、ディスクから読み取るよりも高速ですが(大規模なtgzアーカイブの内容を一覧表示することは、メモリにキャッシュされていない同じ圧縮されていない内容を一覧表示するよりも速いことがわかります)、アーカイブ全体を読み取る必要があります。

インデックスをすばやく読むことができないことは実際には問題になりません。アーカイブされたテーブルの内容を頻繁に読む必要がある場合は、リストを別のファイルに保存できます。たとえば、作成時に次のことができます。

tar cvvf - dir 2> file.tar.xz.list | xz > file.tar.xz

IMOの大きな問題は、アーカイブのシーケンシャルな側面のため、アーカイブの最初の部分を読み取らないと単一のファイルを抽出できないことです。 IOW、アーカイブではランダム読み取りを実行できません。

今見つけることができるファイルの場合、必ずしもそうではありません。

tar圧縮アーカイブを使用してgzip完全に圧縮する場合、圧縮アルゴリズムは最初に見たデータを使用して圧縮するため、最初から解凍を開始する必要があります。

ただし、xzデータを別々のチャンク(圧縮が効果的であるほど大きいサイズ)に圧縮するようにフォーマットを設定できます。つまり、検索可能ファイルの場合、圧縮チャンクの末尾にインデックスを保持する限り、非圧縮ランダムデータにアクセスできます。 (少なくとも塊)。

pixz(並列xz)アーカイブを圧縮するときにこの機能を使用しtar、アーカイブの各メンバーの開始インデックスをファイルの末尾に追加することもできますxz

したがって、検索可能ファイルの場合、圧縮された場合にtarアーカイブの内容のリストをすぐに取得できるだけでなく(メタデータはありませんが)pixz

pixz -l file.tar.xz

ただし、アーカイブ全体を読み取ることなく個々の要素を抽出することもできます。

pixz -x archive/member.txt < file.tar.xz | tar xpf -

7z現在、Unixでこのようなものがほとんど使用されていないのは、主にzipUnixファイルを保持していないからです。これは他のオペレーティングシステム用に設計されています。これを使用してデータを忠実にバックアップすることはできません。所有者(IDと名前)、権限などのメタデータを保存することはできません。シンボリックリンク、デバイス、FIFOなどを保存することはできません。

その中には、任意の名前でメンバーを保存することはできません(一部はバックスラッシュ、改行、コロン、またはASCII以外のファイル名をブロックします)(tarただし、いくつかの形式に制限があります)。

tgz/tar.xz ファイルをディスクに解凍しないでください。

明確でない場合は、tgzor tar.bz2tar.xz...を次のように使用しないでください。

unxz ファイル.tar.xz
tar tvf ファイル.tar
xz ファイル.tar

.tarファイルシステムに圧縮されていないファイルがあると、何かが間違っています。

これらのxzストリームコンプレッサーの重要な点は、次のパイプラインで動的に使用できることです。bzip2gzip

unxz < file.tar.xz | tar tvf -

最新の実装では、//自分をtar呼び出す方法を知っていますが、次のようになります。unxzgunzipbzip2

tar tvf file.tar.xz

この方法も一般的に機能します。インスタントでデータの圧縮を再開し、圧縮されていないバージョンのアーカイブをディスクに保存しません。

はい

これはさまざまな形式の圧縮Linuxカーネルソースツリーです。

$ ls --block-size=1 -sS1
666210304 linux-4.6.tar
173592576 linux-4.6.zip
 97038336 linux-4.6.7z
 89468928 linux-4.6.tar.xz

まず、上記のように、7zとzipは少数のシンボリックリンクを保存できず、ほとんどのメタデータが失われるという点で少し異なります。

システムキャッシュをフラッシュした後にコンテンツを一覧表示する機会がいくつかあります。

$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3
$ time tar tvf linux-4.6.tar > /dev/null
tar tvf linux-4.6.tar > /dev/null  0.56s user 0.47s system 13% cpu 7.428 total
$ time tar tvf linux-4.6.tar.xz > /dev/null
tar tvf linux-4.6.tar.xz > /dev/null  8.10s user 0.52s system 118% cpu 7.297 total
$ time unzip -v linux-4.6.zip > /dev/null
unzip -v linux-4.6.zip > /dev/null  0.16s user 0.08s system 86% cpu 0.282 total
$ time 7z l linux-4.6.7z > /dev/null
7z l linux-4.6.7z > /dev/null  0.51s user 0.15s system 89% cpu 0.739 total

tar.xzこの7年後のPCでも、ファイルのリストがファイルを読むよりも速いことがわかります。.tarこれは、ディスクから追加のメガバイトを読み取る方が小さいファイルを読み取って解凍するよりも速いためです。

もしそうなら、7zまたはzipでアーカイブをリストする方が速いかもしれませんが、問題ではありません。アーカイブでファイルのリストを保存すると、簡単に解決できると言ったように:

$ tar tvf linux-4.6.tar.xz | xz > linux-4.6.tar.xz.list.xz
$ ls --block-size=1 -sS1 linux-4.6.tar.xz.list.xz
434176 linux-4.6.tar.xz.list.xz
$ time xzcat linux-4.6.tar.xz.list.xz > /dev/null
xzcat linux-4.6.tar.xz.list.xz > /dev/null  0.05s user 0.00s system 99% cpu 0.051 total

キャッシュを削除した後でも、速度は7zまたはzipよりはるかに高速です。また、アーカイブとそのインデックスの累積サイズがまだzipまたは7zアーカイブよりも小さいことがわかります。

または、pixzインデックス形式を使用します。

$ xzcat linux-4.6.tar.xz | pixz -9  > linux-4.6.tar.pixz
$ ls --block-size=1 -sS1 linux-4.6.tar.pixz
89841664 linux-4.6.tar.pixz
$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3
$ time pixz -l linux-4.6.tar.pixz > /dev/null
pixz -l linux-4.6.tar.pixz > /dev/null  0.04s user 0.01s system 57% cpu 0.087 total

今、アーカイブの個々の要素を抽出するためにtarアーカイブの最悪のシナリオは、最後の要素にアクセスする場合です。

$ xzcat linux-4.6.tar.xz.list.xz|tail -1
-rw-rw-r-- root/root      5976 2016-05-15 23:43 linux-4.6/virt/lib/irqbypass.c
$ time tar xOf linux-4.6.tar.xz linux-4.6/virt/lib/irqbypass.c | wc
    257     638    5976
tar xOf linux-4.6.tar.xz linux-4.6/virt/lib/irqbypass.c  7.27s user 1.13s system 115% cpu 7.279 total
wc  0.00s user 0.00s system 0% cpu 7.279 total

これは、アーカイブ全体を読み取って解凍する必要があるため、非常に悪いです。比較:

$ time unzip -p linux-4.6.zip linux-4.6/virt/lib/irqbypass.c | wc
    257     638    5976
unzip -p linux-4.6.zip linux-4.6/virt/lib/irqbypass.c  0.02s user 0.01s system 19% cpu 0.119 total
wc  0.00s user 0.00s system 1% cpu 0.119 total

私のバージョンの7zにはランダムアクセス権がないようですtar.xz

$ time 7z e -so linux-4.6.7z linux-4.6/virt/lib/irqbypass.c 2> /dev/null | wc
    257     638    5976
7z e -so linux-4.6.7z linux-4.6/virt/lib/irqbypass.c 2> /dev/null  7.28s user 0.12s system 89% cpu 8.300 total
wc  0.00s user 0.00s system 0% cpu 8.299 total

pixzこれで、以前に作成した項目が作成されました。

$ time pixz < linux-4.6.tar.pixz -x linux-4.6/virt/lib/irqbypass.c  | tar xOf - | wc
    257     638    5976
pixz -x linux-4.6/virt/lib/irqbypass.c < linux-4.6.tar.pixz  1.37s user 0.06s system 84% cpu 1.687 total
tar xOf -  0.00s user 0.01s system 0% cpu 1.693 total
wc  0.00s user 0.00s system 0% cpu 1.688 total

より高速ですが、アーカイブに大きなチャンクがほとんど含まれていないため、まだ比較的遅いです。

$ pixz -tl linux-4.6.tar.pixz
 17648865 / 134217728
 15407945 / 134217728
 18275381 / 134217728
 19674475 / 134217728
 18493914 / 129333248
   336945 /   2958887

したがって、pixz最大19MBの大規模データブロックを読み取って解凍する必要があります。

アーカイブをより小さな塊にし、少しのディスクスペースを犠牲にしてランダムアクセスを高速化できます。

$ pixz -f0.25 -9 < linux-4.6.tar > linux-4.6.tar.pixz2
$ ls --block-size=1 -sS1 linux-4.6.tar.pixz2
93745152 linux-4.6.tar.pixz2
$ time pixz < linux-4.6.tar.pixz2 -x linux-4.6/virt/lib/irqbypass.c  | tar xOf - | wc
    257     638    5976
pixz -x linux-4.6/virt/lib/irqbypass.c < linux-4.6.tar.pixz2  0.17s user 0.02s system 98% cpu 0.189 total
tar xOf -  0.00s user 0.00s system 1% cpu 0.188 total
wc  0.00s user 0.00s system 0% cpu 0.187 total

おすすめ記事