Penggabungan Cepat Beberapa File GZip

93

Saya memiliki daftar file gzip:

file1.gz
file2.gz
file3.gz

Apakah ada cara untuk menggabungkan atau meng-gzip file-file ini menjadi satu file gzip tanpa harus mendekompresinya ?

Dalam praktiknya kami akan menggunakan ini dalam database web (CGI). Di mana web akan menerima kueri dari pengguna dan mencantumkan semua file berdasarkan kueri dan menyajikannya dalam file batch kembali ke pengguna.

neversaint
sumber

Jawaban:

107

Dengan file gzip, Anda cukup menggabungkan file, seperti:

cat file1.gz file2.gz file3.gz > allfiles.gz

Sesuai dengan gzip RFC ,

File gzip terdiri dari serangkaian "anggota" (kumpulan data terkompresi). [...] Para anggota hanya muncul satu demi satu dalam file, tanpa informasi tambahan sebelum, di antara, atau setelah mereka.

Perhatikan bahwa ini tidak persis sama dengan membuat file gzip tunggal dari data yang digabungkan; antara lain, semua nama file asli dipertahankan. Namun, gunzip tampaknya menanganinya sama dengan penggabungan.

Karena alat yang ada umumnya mengabaikan header nama file untuk anggota tambahan, tidak mudah untuk mengekstrak file satu per satu dari hasilnya. Jika Anda ingin ini menjadi mungkin, buat file ZIP sebagai gantinya. ZIP dan GZIP keduanya menggunakan algoritme DEFLATE untuk kompresi sebenarnya (ZIP mendukung beberapa algoritme kompresi lain serta opsi - metode 8 adalah salah satu yang sesuai dengan kompresi GZIP); perbedaannya terletak pada format metadata. Karena metadata tidak terkompresi, cukup sederhana untuk menghapus header gzip dan menempel pada header file ZIP dan catatan direktori pusat sebagai gantinya. Lihat spesifikasi format gzip dan spesifikasi format ZIP .

bdonlan.dll
sumber
41
Nggak. Cuma cat file1.gz file2.gz file3.gz > allfiles.gz. Sesederhana itu :)
bdonlan
1
secara teknis, mereka diawetkan. Hanya saja alat yang ada umumnya tidak memiliki kemampuan untuk mengekstraknya secara terpisah. Anda mungkin ingin melihat cara membuat header dan direktori ZIP - format ZIP menggunakan algoritme kompresi dasar yang sama, jadi ini hanya masalah mengganti metadata (tidak terkompresi). Lihatlah gzip.org/zlib/rfc-gzip.html (format sumber) dan pkware.com/documents/casestudies/APPNOTE.TXT .
bdonlan
20
Lebih baik daripada membuat zip dari file gz, cukup tar. Itu sama dengan catjawabannya tetapi dengan beberapa metadata tambahan. Nanti Anda dapat menghapusnya untuk mendapatkan nama file asli, lalu mengekstrak semua atau hanya beberapa sesuai kebutuhan.
sorpigal
2
@alvas, zcatmendekompresi masukannya, sehingga akan memberi Anda keluaran yang didekompresi dengan .gzekstensi.
bdonlan
2
Rupanya ada beberapa alat yang akan berhenti secara keliru saat mencapai akhir dari anggota gzip pertama. github.com/pysam-developers/pysam/issues/…
Jeremy Leipzig
51

Inilah yang man 1 gzipdikatakan tentang kebutuhan Anda.

Beberapa file terkompresi dapat digabungkan. Dalam hal ini, gunzip akan mengekstrak semua anggota sekaligus. Sebagai contoh:

gzip -c file1  > foo.gz
gzip -c file2 >> foo.gz

Kemudian

gunzip -c foo

setara dengan

cat file1 file2

Tak perlu dikatakan, file1bisa diganti dengan file1.gz.

Anda harus memperhatikan ini:

gunzip akan mengekstrak semua anggota sekaligus

Jadi untuk mendapatkan semua anggota secara individu, Anda harus menggunakan sesuatu tambahan atau menulis, jika Anda ingin melakukannya.

Namun, ini juga dibahas di halaman manual.

Jika Anda ingin membuat satu file arsip dengan banyak anggota sehingga anggota nantinya dapat diekstraksi secara mandiri, gunakan pengarsipan seperti tar atau zip. GNU tar mendukung -zopsi untuk menjalankan gzip secara transparan. gzip dirancang sebagai pelengkap tar, bukan sebagai pengganti.

Nehal Dattani
sumber
13

Gunakan saja kucing. Sangat cepat (0,2 detik untuk 500 MB bagi saya)

cat *gz > final
mv final final.gz

Anda kemudian dapat membaca hasilnya dengan zcat untuk memastikannya cantik:

zcat final.gz

Saya mencoba jawaban lain dari 'gz -c' tetapi saya berakhir dengan sampah ketika menggunakan file yang sudah di-gzip sebagai input (saya kira itu dikompres dua kali).

PV:

Lebih baik lagi, jika Anda memilikinya, 'pv' daripada kucing:

pv *gz > final
mv final final.gz

Ini memberi Anda bilah kemajuan saat berfungsi, tetapi melakukan hal yang sama seperti kucing.

matiu
sumber
11

Anda dapat membuat file tar dari file-file ini dan kemudian melakukan gzip file tar untuk membuat file gzip baru

tar -cvf newcombined.tar file1.gz file2.gz file3.gz
gzip newcombined.tar
Drona
sumber
8
Mengapa tepatnya Anda harus meng-gzip file tar baru? Ini sudah di-zip (selain dari metadata tar, yang seharusnya berukuran kecil).
besok
2
Kamu benar. Tidak akan ada banyak perbedaan dalam ukuran file apakah Anda melakukan gzip atau tidak karena masing-masing file sudah di-gzip. Itu hanya karena dia ingin memiliki file gzip dari tiga file individual.
Drona
1
Gzip ekstra hanya memperlambat akses ke konten tanpa keuntungan. Bagi saya, persyaratan OPs sebenarnya adalah arsip yang dihasilkan berupa file tunggal, dan tidak ada alasan untuk menganggap bahwa file yang dihasilkan harus berupa file gzip.
mc0e