Fitxers comprimits a Linux

La comanda gzip a Linux: comprimir fitxers en .gz



La comanda gzip comprimeix fitxers en el format gzip (extensió .gz), el més habitual a Linux. És ràpida, està instal·lada a totes les distribucions i és la que fan servir per defecte els logs rotats (dpkg.log.2.gz), les pàgines de manual i els arxius .tar.gz. Per defecte substitueix el fitxer original pel comprimit: informe.txt passa a ser informe.txt.gz.

Sintaxi

gzip [opcions] [fitxer...]

Sense fitxers (o amb -), comprimeix el que li arriba per l’entrada estàndard i ho escriu a la sortida estàndard. gzip comprimeix fitxers d’un en un: no agrupa diversos fitxers en un de sol ni comprimeix directoris. Per a això es combina amb tar (més avall).

Opcions més útils

OpcióQuè fa
-kConserva el fitxer original (keep)
-dDescomprimeix (equival a gunzip)
-cEscriu el resultat a la sortida estàndard i no toca l’original
-vMostra el percentatge de compressió de cada fitxer
-lMostra la mida comprimida i original d’un .gz
-tComprova que un .gz no estigui malmès
-rRecursiu: comprimeix tots els fitxers dins dels directoris indicats
-1 … -9Nivell de compressió: -1 (o --fast) és el més ràpid; -9 (o --best), el que més comprimeix. Per defecte, -6
-fForça: sobreescriu sense preguntar, comprimeix enllaços…
-S .sufFa servir un altre sufix en lloc de .gz

Exemples

Comprimir un fitxer (l’original desapareix):

$ ls -l informe.txt
-rw-rw-r-- 1 oscar oscar 1288895 Oct  4 16:02 informe.txt
$ gzip informe.txt
$ ls -l informe.txt.gz
-rw-rw-r-- 1 oscar oscar  428484 Oct  4 16:02 informe.txt.gz

gzip conserva els permisos i la data de modificació de l’original, i guarda el nom original dins del .gz.

Comprimir i conservar l’original:

gzip -k informe.txt

Veure quant ha comprimit:

$ gzip -v dades.txt
dades.txt:	 66.8% -- replaced with dades.txt.gz

Comprimir tots els .txt del directori actual (cada un en el seu .gz):

gzip *.txt

Comprimir tots els fitxers d’un directori i dels seus subdirectoris. Fixa’t que el directori es manté i cada fitxer es comprimeix per separat:

$ gzip -rv logs
logs/app.log:	 65.5% -- replaced with logs/app.log.gz
logs/vells/app.log.1:	 65.5% -- replaced with logs/vells/app.log.1.gz

Sense -r, gzip no fa res amb un directori:

$ gzip logs
gzip: logs is a directory -- ignored

Comprimir al màxim:

gzip -9 informe.txt

Comprimir sense tocar l’original i triant el nom del resultat, amb -c:

gzip -c informe.txt > copia_informe.gz

Comprimir la sortida d’una altra comanda, per exemple una còpia d’una base de dades:

mysqldump botiga | gzip > botiga_$(date +%F).sql.gz

Veure informació d’un .gz

$ gzip -l informe.txt.gz
         compressed        uncompressed  ratio uncompressed_name
             428484             1288895  66.8% informe.txt

El format gzip guarda la mida original en només 32 bits, de manera que per a fitxers de més de 4 GiB la columna uncompressed no és correcta. En aquest cas, la mida real la dona zcat fitxer.gz | wc -c.

Comprovar que un fitxer no està malmès (no mostra res si tot és correcte):

gzip -t informe.txt.gz && echo correcte

Descomprimir

gzip -d informe.txt.gz

És el mateix que gunzip informe.txt.gz. Per llegir un .gz sense descomprimir-lo al disc hi ha unes quantes comandes que ja venen amb el paquet gzip:

zcat informe.txt.gz | head      # mostra el contingut
zless /var/log/dpkg.log.2.gz     # el pagina, com less
zgrep install /var/log/dpkg.log.2.gz   # hi busca text, com grep

Comprimir directoris: tar + gzip

Com que gzip només treballa amb fitxers sols, per comprimir un directori sencer en un únic fitxer primer l’agrupes amb tar, que pot cridar gzip ell mateix amb -z:

tar -czvf projecte.tar.gz projecte/

I per extreure’l:

tar -xzvf projecte.tar.gz

Tens tots els detalls al post de tar.

Quin nivell triar

Amb un log d’accessos d’Apache de 6,2 MB en un Raspberry Pi 4:

ComandaMida finalTemps
gzip -11,1 MB0,17 s
gzip -6 (per defecte)872 KB0,43 s
gzip -9820 KB1,05 s

El -9 triga més del doble que el valor per defecte per guanyar només un 6 %. Normalment el valor per defecte és el millor equilibri. Si necessites comprimir més, val més la pena canviar de format (bzip2, xz o zstd) que pujar el nivell de gzip. I si el problema és la velocitat amb fitxers grans, pigz (paquet pigz) fa el mateix que gzip però aprofitant tots els nuclis del processador, i genera fitxers .gz normals.

Compte amb…

  • L’original desapareix: si vols conservar-lo, -k o -c.
  • Si el .gz ja existeix, gzip pregunta abans de sobreescriure’l (o no ho fa i avisa amb already exists; not overwritten si no hi ha terminal, com en un script). Amb -f el sobreescriu sense preguntar.
  • Un fitxer que ja acaba en .gz no es torna a comprimir: gzip respon already has .gz suffix -- unchanged.
  • Comprimir fitxers ja comprimits no serveix de gaire: fotos JPEG, vídeos, .zip… gairebé no es redueixen.

Comandes relacionades