web-dev-qa-db-ja.com

tar -tvfはファイルを解凍しますか、それとも名前をリストしますか?

32 GBのtar.gzファイルがあります。それから特定のフォルダーを抽出しようとしていたので、ファイル構造を表示するために次のコマンドでコンテンツをリストしました。

tar -tvf file.tar.gz > files.txt

すべてのファイルをリストするのに時間がかかるようです。私の質問は、-tフラグもファイルを抽出しますか?ディスク上で抽出されないことはわかっていますが、時間がかかっているため、実際に何らかのバッファーで処理されているのではないかと思います。

9
Saif

tar.gzファイルにはインデックスがありません。 Zipやその他のアーカイブ形式とは異なり、含まれているファイルやその他のメタデータのリストを取得するのは簡単でも安価でもありません。アーカイブに含まれるファイルを表示するために、tarは実際にアーカイブを圧縮解除してファイルを抽出する必要がありますが、-tオプションの場合はメモリ内でのみ行います。

ユースケースの一般的なパターンがアーカイブに含まれるファイルをリストすることである場合、圧縮ファイルにファイルインデックスを追加できるアーカイブ形式の使用を検討することができます。 g。郵便番号。

おそらく、より複雑なシナリオのために HDF5 形式も見てみたいと思うでしょう。

測定

答えを証明するためにいくつかの測定を行う必要があり、多くのファイルを含むディレクトリを作成し、tar czf files#.tgz files#Zip -r files#.Zip files#の両方をパックしました。

テストでは、アンパックコマンドを毎回2回実行し、2回目の実行の結果を取得して、ディスク速度の測定を回避しようとしました。

テスト1

100,000個の空のファイルを含むディレクトリfiles1

$ time tar tzf files1.tgz >/dev/null
tar tzf files1.tgz > /dev/null  0,56s user 0,09s system 184% cpu 0,351 total
$ time unzip -l files1.Zip >/dev/null
unzip -l files1.Zip > /dev/null  0,30s user 0,34s system 99% cpu 0,649 total

ここでは、Zipが遅くなります。

テスト2

ディレクトリfiles2には、5,000個のファイルと512バイトのランダムデータが含まれています.

$ time tar tzf files2.tgz >/dev/null
tar tzf files2.tgz > /dev/null  0,14s user 0,03s system 129% cpu 0,131 total
$ time unzip -l files2.Zip >/dev/null
unzip -l files2.Zip > /dev/null  0,03s user 0,06s system 98% cpu 0,092 total

まだ納得できませんが、今回はZipの方が高速です。

テスト3

ディレクトリfiles3には、それぞれが5kBの5,000ファイルを含むランダムデータが含まれます。

$ time tar tzf files3.tgz >/dev/null
tar tzf files3.tgz > /dev/null  0,42s user 0,03s system 111% cpu 0,402 total
$ time unzip -l files3.Zip >/dev/null
unzip -l files3.Zip > /dev/null  0,03s user 0,06s system 99% cpu 0,093 total

このテストでは、ファイルが大きくなればなるほど、tarがリストするのが難しくなることがわかります。

結論

私には、Zipが多くの非常に小さな(ほとんど空の)ファイルでのみ気付くオーバーヘッドが少しあるように見えますが、アーカイブに含まれるファイルを一覧表示すると、大きなファイルが多数ある場合はコンテストに勝ちます。

14
Sebastian Stark