残念ながら、 .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
上記は、一致するものが見つかるまで検索してから終了します