Molts cops has d'arxivar un conjunt de fitxers en un de sol, comprimir un fitxer que no fas servir perquè ocupi menys espai, o fer les dos coses a la vegada.

Introducció

Arrenca una màquina virtual Linux amb Windows Subsytem for Linux (WSL).

> connect-wsl archive -new

Empaquetar

tar és un programa que permet empaquetar un conjunt de fitxers en un sol fitxer.

El nom "tar" prové de la frase "Tape ARchive", que era un cinta on es guardaven dades:

I avui en dia encara es fan servir les cintes per guardar dades en volums de Terabytes.

Crear

Crea dos fitxers:

$ echo "one" > one.txt
$ echo "two" > two.txt

A continuació guarda el fitxers en el fitxer numbers.tar amb el flag c (create):

$ tar cf numbers.tar one.txt two.txt

El flag f (file) és necessari per indicar a tarel fitxer que ha de crear.

Si no passes el flag f, tarprotesta:

$ tar c numbers.tar one.txt two.txt 
tar: Refusing to write archive contents to terminal (missing -f option?)
tar: Error is not recoverable: exiting now

Diu que no pot escriure al terminal 😢

De totes maneres tampoc has vist si ha passat quelcom, només que hi ha un nou fitxer molt més gran que els demés:

$ ls -l 
-rw-r--r-- 1 box box 10240 Oct 11 16:18 numbers.tar
-rw-r--r-- 1 box box     4 Oct 11 16:17 one.txt    
-rw-r--r-- 1 box box     4 Oct 11 16:17 two.txt  

A partir de dos de mida 4 ha creat un de mida 10240.

Anem a veure que fa tar amb els fitxers amb el flag v (verbose) per tal que s'expliqui una mica:

$ tar cfv numbers.tar one.txt two.txt
one.txt
two.txt

No s'explica massa 🤔

Llistar

Amb el flag t (list) pots veure els fitxers que forment part del fitxer "tar".

$ tar tf numbers.tar 
one.txt
two.txt      

I afegint l'opció v pots veure metadades d'aquests fitxers:

$ tar tvf numbers.tar 
-rw-r--r-- box/box           4 2024-10-11 16:17 one.txt
-rw-r--r-- box/box           4 2024-10-11 16:17 two.txt

Això ja ho sabiem 🤔

Perqué ets tu qui a creat el fitxer 😅

Extreure

Si guarder un conjunt de fitxers en un fitxer "tar" és per poder recuperar-los si et fan falta.

Borra els fitxers i comencem de nou:

$ rm *

Baixem uns fitxers i el guardem en un .tar:

$ wget -q https://ca.wikipedia.org/wiki/Girona -O girona.html
$ wget -q https://ca.wikipedia.org/wiki/Barcelona -O barcelona.html
$ tar cf cities.tar *.html
$ rm *.html

Com que has borrat els "html" els has perdut ... és un simulacre 🤫

Anem a veure que té el "tar":

$ tar tf cities.tar 
barcelona.html
girona.html

Doncs si, té Barcelona i Girona!

Si vols recuperar Girona pots utlitzar el flag x (extract) amb el nom del fitxer:

$ tar xf cities.tar girona.html
$ ls
cities.tar  girona.html

Borra el fitxer girona.html ...

I si vols recuperar tots els fitxers, doncs no diguis cap fitxer:

$ tar xf cities.tar 
$ ls
barcelona.html  cities.tar  girona.html

Comprimir

Comprimir un fitxer vol dir redur la seva mida.

Al comprimir un fitxer puc perdre informació, com passa amb els audios i els videos.

O no puc perdre gens d'informació, com és el nostre cas.

A continuació veurem alguns eines de compressió de diferent qualitat.

Baixa el fitxer https://gitlab.com/xtec/linux/archive/-/archive/main/archive-main.tar.

$  wget -q https://gitlab.com/xtec/linux/archive/-/archive/main/archive-main.tar -O archive.tar

Desempaqueta el fitxer "tar":

$ tar xf archive.tar
$ cd archive

Tenim 3 fitxers unix.* que tenen el mateix en formats diferents:

$ ls
README.md  unix.md  unix.odt  unix.pdf

gzip

gzip és el mètode "clàssic", i existeix des de l'any 1992

És l'any en que es van celebrar les Olimpiades a Barcelona

gzip utilitza l'algorisme de compressió "DEFLATE", que també s'utilitza en les imatge PNG, en el protocol web HTTP i el protocol SSH.

El seu punt fort és la velocitat, l'ús eficient de la memòria i, sobretot, que s'entén amb tothom.

Com que gzip és una eina tan antiga, gairebé tots els Linux la tenen.

Normalment, els fitxers gzip s'emmagatzemen amb l’extensió .gz.

Comprimeix el fixer unix.md:

$ gzip unix.md 
$ ls
README.md  unix.md.gz  unix.odt  unix.pdf

A més d'estar comprimit, a canviat de nom, ara té .gz al final.

Si vols saber el rati de compressió, utlitza el flag -l:

$ gzip -l unix.md.gz 
         compressed        uncompressed  ratio uncompressed_name
                714                1213  43.3% unix.md

No està malament.

Anem a veure com ho fa amb els altres:

$ gzip *
$ gzip -l unix.md.gz unix.odt.gz unix.pdf.gz
         compressed        uncompressed  ratio uncompressed_name
                714                1213  43.3% unix.md
              52958               54972   3.7% unix.odt
              51078               56563   9.7% unix.pdf
             104750              112748   7.1% (totals)

Els formats odt i pdf ja estan comprimits, i gzip no pot fer massa per comprimir-los més.

Amb el flag -d (deflate) pots descomprimir un fitxer:

$  gzip -d unix.md.gz
$ ls
README.md.gz  unix.md  unix.odt.gz  unix.pdf.gz

Si vols descomprimir tots els fitxers:

$ gzip -d *.gz
$ ls
README.md  unix.md  unix.odt  unix.pdf

Si vols crear un fitxer nou has d'utilitzar una "canalització" amb el flag -c i el > corresponent:

$ gzip -c unix.md > unix.md.gz
$ ls
unix.md.gz  unix.md  unix.odt  unix.pdf

Si vols, pots escullir el nivell de compressió amb un flag "numéric": del -1 al -9.

  • El flag -1 (o --fast) és el més ràpid i el menys eficient
  • El flag -9 (o --slow) és el més lent i el més eficient.

Per defecte, l'opció predeterminada és -6.

Anem a veure la diferència:

gzip -c -1  unix.md > unix-1.md.gz
gzip -c -6  unix.md > unix-6.md.gz
gzip -c -9  unix.md > unix-9.md.gz
$ gzip -l unix-*
         compressed        uncompressed  ratio uncompressed_name
                732                1213  41.8% unix-1.md        
                714                1213  43.3% unix-6.md        
                714                1213  43.3% unix-9.md        
               2160                3639  41.4% (totals)

Activitat. Crea un espai de treball:

$ mkdir ~/gzip
$ cd ~/gzip

Baixa diferents arxius de viquipedia, comprimeix els fitxers i compara la seva mida.

$ wget -q https://ca.wikipedia.org/wiki/Lleida -O lleida.html
$ gzip lleida.html
$ gzip -l lleida.html.gz

bzip2

bzip2 és una implementació d'un algorisme anomenat "Burrows-Wheeler".

Comprimeix més que gzip a canvi d'estar més estona per fer comprimir i necessitar més memòria, però no per descomprimir.

Si has d'enviar fitxers per Internet, bzip2 és una bona opció perqué són més petits si l'has d'enviar molts cops.

L'extensió que fan servir aquests fitxers és bzip2.

Instal.la bzip2:

$ sudo apt install -y bzip2

Descarrega un fitxer:

$ wget -q https://ca.wikipedia.org/wiki/Madrid -O madrid.html

bzip2 funciona com gzip:

$ bzip2 madrid.html
$ bzip2 -d madrid.html.bz2

A continuació compara gzip amb bzip2:

$ gzip -c madrid.html > madrid.html.gz
$ bzip2 -c madrid.html > madrid.html.bz2
$ ls -l madrid.html.*
-rw-r--r-- 1 box box 66049 Oct 11 09:37 madrid.html.bz2
-rw-r--r-- 1 box box 75445 Oct 11 18:14 madrid.html.gz 

Pots veure que el fitxer .bz2 és més petit.

xz

xz va apareixer el 2009, i utilitza un algorisme de compressió conegut com LZMA2.

El problema és que fa servir més memòria que els altres.

Els fitxers "xz" tenen l'extensió .xz.

$ xz madrid.html
$ xz -d madrid.html.xz

A diferència de bzip2, xz també té l'opció -d per saber el rati de compressió del fitxer:

$ $ xz madrid.html
$ xz -l madrid.html.xz 
Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename      
    1       1     60.4 KiB    396.7 KiB  0.152  CRC64   madrid.html.xz

No està malament!

Activitat. Comprimeix el fitxer amb gzip, bzip2 i xz i compara resultats:

TODO

Empaquetar i comprimir

Empaquetar paquets amb tar no redueix la mida del fitxer tar.

El que es fa normalment és combinar tar amb un dels algorismes de compressió.

Crea una carpeta ossos:

$ cd
$ mkdir ossos

Baixa alguns documents d'ossos a la carpeta ossos:

$ wget -q https://ca.wikipedia.org/wiki/Panda_gegant -O ossos/panda-gegant.html
$ wget -q https://ca.wikipedia.org/wiki/Os_polar -O ossos/os-polar.html

Pots comprimir una carpeta només amb tar:

$ tar cf ossos.tar ossos/

Però pots passar a tarel flag z per comprimir amb gzip:

$ tar cf ossos.tar ossos/
$ tar cfz ossos.tar.gz ossos/
$ ls -l ossos.tar*
-rw-r--r-- 1 box box 706560 Oct 11 18:50 ossos.tar   
-rw-r--r-- 1 box box 119253 Oct 11 18:50 ossos.tar.gz

Borra la carpeta ossos:

$ rm -rf ossos

Recupera el contingut de la carpeta ossos:

$ tar xfz ossos.tar.gz 
$ ls -l ossos
total 684
-rw-r--r-- 1 box box 271405 Oct 11 09:37 os-polar.html    
-rw-r--r-- 1 box box 424106 Oct 11 09:37 panda-gegant.html

TODO

Continua llegint aquest document: Document