Birden Çok GZip Dosyasının Hızlı Birleştirilmesi


93

Gzip dosyalarının bir listesi var:

file1.gz
file2.gz
file3.gz

Bu dosyaları , sıkıştırmasını açmak zorunda kalmadan tek bir gzip dosyasında birleştirmenin veya gziplemenin bir yolu var mı ?

Pratikte bunu bir web veritabanında (CGI) kullanacağız. Web'in kullanıcıdan bir sorgu alacağı ve sorguya dayalı olarak tüm dosyaları listeleyeceği ve bunları bir toplu iş dosyasında kullanıcıya geri sunacağı yer.

Yanıtlar:


107

Gzip dosyalarıyla, dosyaları şu şekilde birleştirebilirsiniz:

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

Başına gzip RFC ,

Bir gzip dosyası bir dizi "üyeden" (sıkıştırılmış veri kümeleri) oluşur. [...] Üyeler basitçe dosyada birbiri ardına görünür, öncesinde, arasında veya sonrasında ek bilgi olmadan.

Bunun, birleştirilmiş verilerden tek bir gzip dosyası oluşturmakla tam olarak aynı olmadığını unutmayın; diğer şeylerin yanı sıra, tüm orijinal dosya adları korunur. Ancak, gunzip bunu bir birleştirme işlemine eşdeğer olarak ele alıyor gibi görünüyor.

Mevcut araçlar genellikle ek üyeler için dosya adı başlıklarını yok saydığından, sonuçtan tek tek dosyaları çıkarmak kolay değildir. Bunun mümkün olmasını istiyorsanız, bunun yerine bir ZIP dosyası oluşturun. ZIP ve GZIP, gerçek sıkıştırma için DEFLATE algoritmasını kullanır (ZIP, diğer bazı sıkıştırma algoritmalarını ve bir seçeneği destekler - yöntem 8, GZIP'nin sıkıştırmasına karşılık gelen yöntemdir); fark, meta veri biçimindedir. Meta veriler sıkıştırılmamış olduğundan, gzip başlıklarını çıkarmak ve bunun yerine ZIP dosya başlıklarını ve merkezi bir dizin kaydını tutmak yeterince basittir. Bakınız gzip formatında şartname ve ZIP formatında şartname .


41
Hayır! Sadece cat file1.gz file2.gz file3.gz > allfiles.gz. Gerçekten bu kadar basit :)
bdonlan

1
teknik olarak konuşursak, korunurlar. Sadece mevcut araçların genellikle bunları ayrı ayrı çıkarma kabiliyeti yoktur. Bir ZIP başlığı ve dizini oluşturmaya bakmak isteyebilirsiniz - ZIP formatı aynı temel sıkıştırma algoritmasını kullanır, bu nedenle (sıkıştırılmamış) meta verileri değiştirmek yeterlidir. Bir göz atın gzip.org/zlib/rfc-gzip.html (kaynak biçimi) ve pkware.com/documents/casestudies/APPNOTE.TXT .
bdonlan

20
Bir gz dosyası zip dosyası oluşturmaktan daha iyidir, sadece onları katranlayın. Cevapla aynı, catancak bazı ekstra meta verilerle. Daha sonra orijinal dosya adlarını almak için bunları kaldırabilir, ardından gerektiğinde hepsini veya birkaçını açabilirsiniz.
sorpigal

2
@alvas, zcatgirdisinin sıkıştırmasını açar, böylece size bir .gzuzantı ile sıkıştırılmış bir çıktı verir .
bdonlan

2
Görünüşe göre, ilk gzip'lenmiş üyenin sonuna geldiklerinde yanlışlıkla duracak bazı araçlar var. github.com/pysam-developers/pysam/issues/…
Jeremy Leipzig

51

man 1 gzipİhtiyacınız hakkında söylenenler burada .

Birden çok sıkıştırılmış dosya birleştirilebilir. Bu durumda, gunzip tüm üyeleri aynı anda çıkaracaktır. Örneğin:

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

Sonra

gunzip -c foo

eşdeğerdir

cat file1 file2

Söylemeye gerek yok file1, ile değiştirilebilir file1.gz.

Bunu fark etmelisiniz:

gunzip tüm üyeleri aynı anda çıkaracaktır

Bu nedenle, tüm üyeleri ayrı ayrı toplamak için, isterseniz ek bir şeyler kullanmanız veya yazmanız gerekecektir.

Bununla birlikte, bu aynı zamanda man sayfasında da ele alınmaktadır.

Üyelerin daha sonra bağımsız olarak çıkarılabilmesi için birden fazla üyeye sahip tek bir arşiv dosyası oluşturmak istiyorsanız, tar veya zip gibi bir arşivleyici kullanın. GNU tar, -zgzip'i şeffaf olarak çağırma seçeneğini destekler . gzip, bir ikame olarak değil, katranın tamamlayıcısı olarak tasarlanmıştır.


13

Sadece kediyi kullan. Çok hızlı (benim için 500 MB için 0.2 saniye)

cat *gz > final
mv final final.gz

Daha sonra, güzel olduğundan emin olmak için çıktıyı zcat ile okuyabilirsiniz:

zcat final.gz

'Gz -c'nin diğer cevabını denedim ama zaten gzip'lenmiş dosyaları girdi olarak kullandığımda çöp ile sonuçlandım (sanırım onları iki kez sıkıştırdı).

PV:

Daha da iyisi, eğer sahipseniz kedi yerine 'pv':

pv *gz > final
mv final final.gz

Bu size çalışırken bir ilerleme çubuğu verir, ancak kedi ile aynı şeyi yapar.


11

Bu dosyalardan bir tar dosyası oluşturabilir ve ardından yeni gzip dosyasını oluşturmak için tar dosyasını gzip edebilirsiniz.

tar -cvf newcombined.tar file1.gz file2.gz file3.gz
gzip newcombined.tar

8
Neden yeni tar dosyasını tam olarak gzip'lemelisiniz? Zaten sıkıştırılmış (küçük olması gereken katran meta verileri dışında).
thiton

2
Haklısın. Dosyayı gzip etseniz de sıkıştırmasanız da dosya boyutunda çok fazla fark olmaz çünkü tek tek dosyalar zaten gzip'lidir. Bunun nedeni, üç ayrı dosyadan gzip dosyasına sahip olmak istemesidir.
Drona

1
Ekstra gzip, herhangi bir kazanç sağlamadan içeriğe erişimi yavaşlatır. Bana öyle geliyor ki OP'lerin gereksinimi, sonuçta ortaya çıkan arşivin tek bir dosya olması ve sonuçta ortaya çıkan dosyanın bir gzip dosyası olması gerektiğini varsaymak için hiçbir neden yok.
mc0e
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.