web-dev-qa-db-ja.com

tar.gzファイルをすばやく組み合わせる最適な方法

複数のtar.gzファイルをすばやく組み合わせる方法を探しています。

ユースケースは、クライアントがダウンロードボタンをクリックして、tar.gzファイルが配信されるようにすることです。アプリケーションの[〜#〜] gui [〜#〜]に、アウトバウンドダウンロードに追加情報を追加するための構成オプションがあります。このオプションを選択した場合、追加のtar.gzファイルをアウトバウンドダウンロードに結合する必要があります。

私はここでたくさんのデータを扱っています。追加のtar.gzファイルは、非圧縮時にGBを超えます。さらに、常に配信されるデフォルトのtar.gzファイルは、非圧縮時に10 GBを超える可能性があり、100を超えるファイルを含めることができます。使用しているデータのサイズが大きいため、圧縮形式(tar.gz)でディスクに保存されます。

このメカニズムをBashスクリプトまたはJavaのいずれかに実装しようとしています。

2
Andrew

[〜#〜] tldr [〜#〜]:通常はそれらを連結するだけです

gzipによって使用されるファイル形式は、2つ以上の圧縮ファイルを連結し、結果を解凍すると、非圧縮バージョンを連結するのと同じデータが得られるように設計されています。 https://stackoverflow.com/questions/8005114/fast-concatenation-of-multiple-gzip-files を参照してください
https://stackoverflow.com/questions/16715484/can-multiple-gz-files-be-combined-such-that-they-extract-into-a-single-file ==

同様に、tar形式は元々、アーカイブの最後にエントリを追加できるように設計されていました。 '(t)ape(ar)chive'はバックアップと交換に磁気テープを使用するように設計されており、使用していたため、これは事実上必要でした。1950年代から1980年代の磁気テープドライブは(大まかに)安全に '書き換え'(更新)できませんでした。既存のデータは最後に追加するだけです。 (これらのドライブcould 'tape mark'を使用してテープ上の個別の論理ファイルを作成しましたが、Unixシステムはmagtapeのメタデータ別名ラベルをサポートしていませんでした。 、したがって、既存のアーカイブに追加するtarアプローチが非常に好まれました。)

近年、これはあまり一般的ではなくなり、GNU tarはデフォルトでサポートされなくなりました。-i(または長い形式の--ignore-zeros)を指定する必要がありますそしてそれはうまくいきます:

$ printf 'ONEONEONE%90d\n' {0..99999} >file1
$ printf 'TWOTWOTWO%90d\n' {0..199999} >file2
$ ll
total 29300
-rw-r--r--. 1 dthomps users 10000000 Sep  9 02:14 file1
-rw-r--r--. 1 dthomps users 20000000 Sep  9 02:15 file2
$ tar -czf tar1.tgz file1
$ tar -czf tar2.tgz file2
    # or tar -cf - file1 |gzip >tar1.tgz and similarly for 2, see below
$ cat tar2.tgz tar1.tgz >combined.tgz
$ tar -tvzif combined.tgz
-rw-r--r-- dthomps/users 20000000 2016-09-09 02:15 file2
-rw-r--r-- dthomps/users 10000000 2016-09-09 02:14 file1
  # or gunzip <combined.tgz |tar -tvif - see below
$

古いtarは、デフォルトでアーカイブの連結をサポートする場合があります(-iなし)。後で古いテストシステムのいくつかを起動する時間があれば、更新します。ただし、通常、gtarのような統合された-z圧縮をサポートしていないため、tar cf - | gzip >およびgunzip < | tar -xf -フォームを使用する必要があります。

今日一般的で好まれているように、アーカイブ内のファイルに相対パスを使用する場合、連結された結果から抽出するときに、すべてのエントリ(または選択したすべてのエントリ)が同じ新しいディレクトリを基準にして抽出されるため、必ずそれぞれを作成してください必要に応じて連携する相対パスを使用して「ピース」をアーカイブします。追加された部分のファイルをメイン部分のファイルに置き換える場合は、同じ相対パス/名前を使用します。個別のファイルを作成する場合は、個別の相対パス/名前を使用してください。

4