web-dev-qa-db-fra.com

Concaténation rapide de plusieurs fichiers GZip

J'ai la liste des fichiers gzip:

file1.gz
file2.gz
file3.gz

Existe-t-il un moyen de concaténer ou de compresser ces fichiers dans un fichier gzip sans décompresser eux?

En pratique, nous utiliserons cela dans une base de données Web (CGI). Où le Web recevra une requête de l'utilisateur, listera tous les fichiers en fonction de la requête et les présentera dans un fichier de commandes à l'utilisateur.

77
neversaint

Avec les fichiers gzip, vous pouvez simplement concaténer les fichiers ensemble. Selon le gzip RFC ,

Un fichier gzip consiste en une série de "membres" (ensembles de données compressés). [...] Les membres apparaissent simplement l'un après l'autre dans le fichier, sans information supplémentaire avant, entre ou après eux.

Notez que ce n'est pas exactement la même chose que de construire un seul fichier gzip avec les données concaténées. entre autres, tous les noms de fichiers originaux sont conservés. Cependant, gunzip semble le traiter comme une concaténation.

Étant donné que les outils existants ignorent généralement les en-têtes de nom de fichier des membres supplémentaires, il est difficile d'extraire des fichiers individuels du résultat. Si vous voulez que cela soit possible, créez plutôt un fichier Zip. Zip et GZIP utilisent tous deux l’algorithme DEFLATE pour la compression réelle (Zip prend en charge d’autres algorithmes de compression ainsi qu’une option (la méthode 8 correspond à celle qui est utilisée pour la compression de GZIP); la différence réside dans le format des métadonnées. Comme les métadonnées ne sont pas compressées, il est assez simple de supprimer les en-têtes gzip et de les ajouter aux en-têtes de fichiers Zip et à un enregistrement de répertoire central. Reportez-vous à spécification du format gzip et à spécification du format Zip .

85
bdonlan

Voici ce que man 1 gzip dit à propos de vos besoins.

Plusieurs fichiers compressés peuvent être concaténés. Dans ce cas, gunzip extraira tous les membres à la fois. Par exemple:

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

Ensuite

gunzip -c foo

est équivalent à

cat file1 file2

Inutile de dire que file1 peut être remplacé par file1.gz.

Vous devez remarquer ceci:

gunzip extraira tous les membres à la fois

Donc, pour obtenir tous les membres individuellement, vous devrez utiliser quelque chose de plus ou écrire si vous souhaitez le faire.

Cependant, ceci est également abordé dans la page de manuel.

Si vous souhaitez créer un seul fichier archive avec plusieurs membres afin que les membres puissent ensuite être extraits indépendamment, utilisez un archiveur tel que tar ou Zip. GNU tar supporte le -z option pour appeler gzip de manière transparente. gzip est conçu comme un complément au tar, pas comme un substitut.

46
Nehal Dattani

Il suffit d'utiliser un chat. C'est très rapide (0,2 seconde pour 500 Mo pour moi)

cat *gz > final
mv final final.gz

Vous pouvez ensuite lire la sortie avec zcat pour vous assurer que c'est joli:

zcat final.gz

J'ai essayé l'autre réponse de 'gz -c' mais je me suis retrouvé avec des ordures en utilisant des fichiers déjà compressés en entrée (je suppose que cela les a compressés deux fois).

PV:

Mieux encore, si vous en avez, "pv" au lieu de chat:

pv *gz > final
mv final final.gz

Cela vous donne une barre de progression car cela fonctionne, mais fait la même chose que chat.

13
matiu

Vous pouvez créer un fichier tar contenant ces fichiers, puis gzip le fichier tar pour créer le nouveau fichier gzip.

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