巨大なtgzファイルから単一のファイルを抽出する


19

巨大なtarファイル(約500G)があり、そこから1つのファイルだけを抽出したくありません。
ただし、実行tar -xvf file.tgz path/to/fileすると、コンテンツ全体がまだメモリに読み込まれているように見え、抽出に1時間以上かかります。また--exclude=ignore.txt、ignore.txtがパターンのリストである場所を使用して、無駄なパスの通過を阻止しようとしましたが、うまくいかないようです。

たぶんタールを理解していない...ファイルを素早く抽出する方法はありますか?


私も同じことを考えています。私が探していますファイルはすぐに発見され、抽出された-そして私は、処理する達成の残りの時間を待つ必要があります。o(
maasha

回答:


14

残念ながら、.tar.gzアーカイブの単一のメンバーを解凍するには、アーカイブ全体を処理する必要があり、それを修正するためにできることはあまりありません。

これは、.zip(およびのような他の形式の.rar)アーカイブがはるかにうまく機能する場所です。これは、zip形式に含まれるすべてのファイルの中央ディレクトリがファイルの中央を指す直接オフセットzipであるため、アーカイブメンバーをすべて処理せずにすばやく抽出できるためです。

処理.tar.gzが非常に遅い理由を尋ねるかもしれません。

.tar.gz(しばしばとして短縮.tgz)は、.tarコンプレッサーでgzip圧縮されたアーカイブです。gzip1つのファイルでのみ機能するストリーミングコンプレッサーです。gzipストリームの一部を取得したい場合は、全体として圧縮を解除する必要があり、これが.tar.gz(および.tar.bz2.tar.xzおよびに基づいた他の同様の形式のために)本当にそれを殺すものです.tar

.tar形式は実際には非常に単純です。これは単に512バイトのファイルまたはディレクトリヘッダー(名前、サイズなど)のストリームであり、それぞれにファイルまたはディレクトリの内容が続きます(必要に応じて0バイトで512ブロックサイズにパディングされます)。ヘッダーの512ブロックが完全にヌルである場合、これは.tarアーカイブの終了を意味します。

一部の人々は、.tarアーカイブのメンバーでさえ迅速にアクセスできないと考えていますが、これは全く真実ではありません。.tarアーカイブに含まれる大きなファイルが少ない場合、実際に次のヘッダーをすばやくシークできるため、必要なアーカイブメンバーを数回のシークで見つけることができます(ただし、アーカイブメンバーと同じ数のシークが必要になる場合があります)。.tarアーカイブに多数の小さなファイルが含まれている場合、これは、圧縮されていない場合でもメンバーの迅速な取得が事実上不可能になることを意味します.tar


3
gzipは非圧縮データをストリーミングできます。すべてを元に戻す必要はありません。ただし、.tarはテープアーカイブの略であるため、探しているファイルが見つかるまでファイル全体を走査する必要があります。別のtarファイルが存在する可能性があるため、tarは探し続けますが、後でtarファイルにコピーします。
kurtm

9

あなたが大規模なtarファイルから1つのファイルだけを抽出している場合は、GNUを使用しているtarとするには、tarファイルが追加されていないことを保証することができ、あなたが使用して大幅な性能向上を得ることができます--occurrence

このオプションは、要求した各ファイルの最初の出現を見つけるとすぐに停止するようtarに指示します。たとえば、

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

それはそれぞれのコピー見つかった後、全体のtarball介してスプールではないだろうpasswdとしshadow、代わりにそれが停止します。これらのファイルが終わり近くに表示される場合、パフォーマンスの向上はそれほど大きくありませんが、500Gファイルの半分まで表示される場合、多くの時間を節約できます。

tarシングルショットバックアップに使用し、実際のテープドライブを使用していない人にとって、この状況はおそらく典型的なケースです。

あなたも渡すことに注意してください--occurrence=NUMBERあなたがそこにいることを知っている場合に役立ちます各ファイルのNUMBERth発生取得するためにあるアーカイブ内の複数のバージョンを。デフォルトでは、動作はNUMBER1に等しくなります。


特定のファイルが最初に出てくるようにtarを作成する方法はありますか?それで--occurrence最初のファイルがすぐに起動しますか?ファイル名についてだと思うので、たとえばaaaaa.jpgと呼ばれるものが最初に出てくるでしょうか?
ジェフ

1
@ジェフ:そうでもない。これtarは、見つかったファイルの新しいバージョンを探すためにtarballを検索し続けることを防ぐだけです。代わりに、manページにあるように、戻りますthe Nth occurrence。あなたは指定した場合は1コマンドラインで抽出したファイルをし、あなたが言う--occurrenceその後、tarは、すぐにそれがそのファイルを発見したとして終了しますので、効果的に停止する「最初のファイル。」
phogg

1

残念ながら、tarファイル形式には一元化された目次が含まれていないため、特定のファイルを見つけるにはアーカイブを順番に読み取る必要があります。もともとはテープバックアップ用に設計されたもので(「tar」はt ape ar chiveに由来します)、どのような場合でもそのような操作をサポートしていませんでした。

そのため、おそらく待つ必要があります。


1

大きなtarballの使用を扱う場合:

--fast-readpath/to/fileこの場合、ファイル名オペランドに一致する最初のアーカイブエントリのみを抽出します。これは、とにかく常にtarballで一意です。

tar -xvf file.tgz --fast-read path/to/file

上記は一致が見つかるまで検索し、終了します


1
なぜこれが0ポイントのままなのかを理解したかった。man tar(GNU tar 1.29)は、このオプションも印刷しません。ただし、Ubuntuではデフォルト有効になっているようです。すぐに読んで、何--fast-readが違うのかわかりません--occurrence。しかし--occurrence、Ubuntuページにはありませんが、それはにありman tarます。ある--fast-read--occurrenceおそらく同じもの?
ジェフ

これらのオプションはどちらも標準では指定されておらず、非標準オプションと同様に、システム上のユーティリティがそれらをサポートしていることを確認する必要があります。--occurrencesオプションはGNU tarでサポートされています。--fast-readオプションは、Ubuntuによりbsdtarとしてパッケージ化されたFreeBSD tarの最新バージョンでサポートされています。詳細はこちらをご覧ください。
phogg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.