Esiste una fusione GZIP che unisce due file GZIP senza decomprimerli?
Domanda
Diciamo che c'è a.gz e b.gz.
$ gzip_merge a.gz b.gz -output c.gz
Mi piacerebbe avere questo programma. Certo,
$ cat a.gz b.gz > c.gz
non funziona. Perché il blocco DEFLATE finale di a.gz ha BFINAL e l'intestazione GZIP di b.gz. (Fare riferimento a RFC1951, RFC1952) Ma se si disinserisce BFINAL, si getta via la seconda intestazione GZIP e si cammina attraverso i limiti di byte del secondo file gzip, è possibile unirlo.
In effetti, ho pensato di scrivere un programma open source per questo argomento, ma non sapevo come pubblicarlo. Così ho chiesto a Joel di essere il mio responsabile del programma, e l'ho guidato attraverso la mia spiegazione e difesa, finalmente ha capito cosa volevo fare, ma ha detto che era troppo occupato. : (
Certo, potrei scriverne uno io stesso e provare a pubblicarlo. Ma non posso farlo da solo perché il mio lavoro quotidiano appartiene alla proprietà del mio datore di lavoro.
Ci sono volontari? Potremmo lavorare come programmatore (me), editore (tu) o programmatore (tu), editore (me). Tutto ciò di cui ho bisogno è un po 'di credito. Una volta ho implementato una macchina virtuale Universal Decompressor descritta in RFC3320. Quindi so che questo è fattibile.
OPPURE, potresti indicarmi quel programma. Sarebbe molto utile per la gestione di file di registro come l'unione di file di registro compressi con tag 365 (giorno) in uno. ;)
Grazie.
Soluzione
Certo, cat a.gz b.gz > c.gz non funziona.
In realtà, funziona benissimo. L'ho appena provato. È persino documentato (una specie di) nella pagina man di gzip.
Multiple compressed files can be concatenated. In this case, gunzip
will extract all members at once. For example:
gzip -c file1 > foo.gz
gzip -c file2 >> foo.gz
Then
gunzip -c foo
is equivalent to
cat file1 file2
Altri suggerimenti
Potresti anche:
zcat a.gz b.gz > c.txt && gzip c.txt
fintanto che la tua distribuzione Linux / Unix ha incorporato zcat, cosa che la maggior parte di loro fa (e potresti installarla per quelli che non lo fanno.)
In alternativa:
zcat a.gz b.gz | gzip -c > c.txt.gz