残念ながら、 .tar.gz
の単一のメンバーを展開するには アーカイブ全体を処理する必要があり、それを修正するためにできることはあまりありません。
これは .zip
の場所です (および .rar
のような他の形式 ) アーカイブは zip
であるため、はるかにうまく機能します。 形式には、そこに含まれるすべてのファイルの中央ディレクトリがあり、直接オフセットは zip
の中央を指しています ファイルなので、全体を処理せずにアーカイブ メンバーをすばやく抽出できます。
.tar.gz
を処理する理由を尋ねるかもしれません そんなに遅いですか?
.tar.gz
(しばしば .tgz
と短縮されます) ) は単に .tar
です gzip
で圧縮されたアーカイブ コンプレッサー。 gzip
1 つのファイルのみで動作するストリーミング コンプレッサーです。 gzip
の一部を取得したい場合 ストリーム全体を圧縮解除する必要があり、これが実際に .tar.gz
で終了します (そして .tar.bz2
の場合) 、 .tar.xz
および .tar
に基づく他の同様の形式 ).
.tar
形式は実際には非常に単純です。これは、512 バイトのファイルまたはディレクトリ ヘッダー (名前、サイズなど) の単純なストリームであり、それぞれにファイルまたはディレクトリの内容が続きます (必要に応じて 0 バイトで 512 ブロック サイズにパディングされます)。ヘッダーの完全にヌルの 512 ブロックを観察すると、これは .tar
の終わりを意味します アーカイブ。
.tar
でさえ アーカイブ メンバーにすばやくアクセスすることはできませんが、それほどではありません 真実。 .tar
の場合 アーカイブには大きなファイルがほとんど含まれていないため、実際には次のヘッダーをすばやくシークできるため、必要なアーカイブ メンバーを数回のシークで見つけることができます (ただし、アーカイブ メンバーと同じ数のシークが必要になる場合があります)。 .tar
の場合 アーカイブには多数の小さなファイルが含まれています。これは、圧縮されていない .tar
であっても、迅速なメンバーの取得が事実上不可能になることを意味します .
大きな tar ファイルから 1 つのファイルだけを抽出する場合は、GNU tar
を使用しています。 、tar ファイルが決して追加されていないことを保証できます --occurrence
を使用すると、パフォーマンスが大幅に向上します。 .
このオプションは、要求した各ファイルの最初の出現を見つけるとすぐに停止するように tar に指示します。たとえば、
tar xf large-backup.tar --occurrence etc/passwd etc/shadow
passwd
のそれぞれのコピーを 1 つ見つけた後、tarball 全体をスプールしません。 と shadow
、代わりに停止します。これらのファイルが最後近くに表示される場合、パフォーマンスの向上はあまりありませんが、500G ファイルの途中に表示される場合でも、多くの時間を節約できます。
tar
をお使いの方へ シングル ショット バックアップで、実際のテープ ドライブを使用しない場合、この状況はおそらく典型的なケースです。
--occurrence=NUMBER
を渡すこともできることに注意してください 各ファイルの NUMBER 番目のオカレンスを取得します。 があることがわかっている場合に役立ちます アーカイブ内の複数のバージョン。デフォルトでは、動作は NUMBER
と同じです 1.
大きな tarball を扱う場合:
<ブロック引用>
--fast-read
ファイル名オペランド path/to/file
に一致する最初のアーカイブ エントリのみを抽出するには この場合 - とにかく tarball で常に一意です
tar -xvf file.tgz --fast-read path/to/file
上記は、一致するものが見つかるまで検索してから終了します