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 dues coses a la vegada.
Introducció
Arrenca una màquina virtual Linux amb Windows - Windows Subsystem for Linux (WSL).
> connect-wsl archive -newEmpaquetar
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.txtA continuació guarda els fitxers en el fitxer numbers.tar amb el flag c (create):
$ tar cf numbers.tar one.txt two.txtEl 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.txttar: Refusing to write archive contents to terminal (missing -f option?)tar: Error is not recoverable: exiting nowDiu 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 altres:
$ 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.txtA partir de dos de mida 4 ha creat un de mida 10240.
Anem a veure què fa tar amb els fitxers amb el flag v (verbose) per tal que s’expliqui una mica:
$ tar cfv numbers.tar one.txt two.txtone.txttwo.txtNo s’explica massa 🤔
Llistar
Amb el flag t (list) pots veure els fitxers que forment part del fitxer “tar”.
$ tar tf numbers.tarone.txttwo.txtI 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.txtAixò ja ho sabíem 🤔
Perquè ets tu qui ha 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 *.htmlCom que has esborrat els “html” els has perdut … És un simulacre 🤫
Anem a veure què té el “tar”:
$ tar tf cities.tarbarcelona.htmlgirona.htmlDoncs sí, 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$ lscities.tar girona.htmlBorra el fitxer girona.html …
I si vols recuperar tots els fitxers, doncs no diguis cap fitxer:
$ tar xf cities.tar$ lsbarcelona.html cities.tar girona.htmlComprimir
Comprimir un fitxer vol dir reduir la seva mida.
En 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 algunes 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.tarDesempaqueta el fitxer “tar”:
$ tar xf archive.tar$ cd archiveTenim 3 fitxers unix.* que tenen el mateix en formats diferents:
$ lsREADME.md unix.md unix.odt unix.pdfgzip
gzip és el mètode “clàssic”, i existeix des de l’any 1992
És l’any en què es van celebrar les Olimpíades a Barcelona
gzip utilitza l’algorisme de compressió “DEFLATE”, que també s’utilitza en les imatges PNG, en el protocol web HTTP i el protocol Network - 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 sistemes Linux la tenen.
Normalment, els fitxers gzip s’emmagatzemen amb l’extensió .gz.
Comprimeix el fixer unix.md:
$ gzip unix.md$ lsREADME.md unix.md.gz unix.odt unix.pdfA més d’estar comprimit, ha canviat de nom, ara té .gz al final.
Si vols saber la ràtio de compressió, utilitza el flag -l:
$ gzip -l unix.md.gz compressed uncompressed ratio uncompressed_name 714 1213 43.3% unix.mdNo 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$ lsREADME.md.gz unix.md unix.odt.gz unix.pdf.gzSi vols descomprimir tots els fitxers:
$ gzip -d *.gz$ lsREADME.md unix.md unix.odt unix.pdfSi vols crear un fitxer nou has d’utilitzar una “canalització” amb el flag -c i el > corresponent:
$ gzip -c unix.md > unix.md.gz$ lsunix.md.gz unix.md unix.odt unix.pdfSi vols, pots escollir 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.gzgzip -c -6 unix.md > unix-6.md.gzgzip -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 ~/gzipBaixa diferents arxius de Wikipedia, 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.gzbzip2
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 bzip2Descarrega un fitxer:
$ wget -q https://ca.wikipedia.org/wiki/Madrid -O madrid.htmlbzip2 funciona com gzip:
$ bzip2 madrid.html$ bzip2 -d madrid.html.bz2A 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.gzPots veure que el fitxer .bz2 és més petit.
xz
xz va aparèixer el 2009, i utilitza un algorisme de compressió conegut com a 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.xzA diferència de bzip2, xz també té l’opció -d per saber la ràtio de compressió del fitxer:
$ $ xz madrid.html$ xz -l madrid.html.xzStrms Blocks Compressed Uncompressed Ratio Check Filename 1 1 60.4 KiB 396.7 KiB 0.152 CRC64 madrid.html.xzNo està malament!
Activitat. Comprimeix el fitxer amb gzip, bzip2 i xz i compara resultats:
TODOEmpaquetar 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 ossosBaixa 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.htmlPots 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.gzBorra la carpeta ossos:
$ rm -rf ossosRecupera el contingut de la carpeta ossos:
$ tar xfz ossos.tar.gz$ ls -l ossostotal 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.htmlTODO
Continua llegint aquest document: Document