.. _compresion: Compresión ========== Los compresores más habituales en sistemas *Linux* son: :program:`gzip` (extensión asociada: :kbd:`.gz`), que se basa (al igual que el formato `zip `_ muy habitual en sistemas *Windows*) en la versión `DEFLATE `_ del algoritmo `LZ77 `_. :program:`bzip2` (extensión asociada: :kbd:`.bz2` o :kbd:`.bzip2`.), que frente al anterior obtiene unos ratios de compresión mucho mayores a costa de penalizar mucho los tiempos de compresión y la descompresión. :program:`xz` (extensión asociada: :kbd:`.xz`), más moderno y que, comprimiendo aún más que :program:`bzp2`, logra reducir enormemente sus tiempos de descompresión. Su extensión asociada habitual es :kbd:`.xz`. Prácticamente, ha desplazado por completo a :program:`bzip2` en los usos a los que se destinaba este formato\ [#]_. :program:`zstd` (extensión asociada: :kbd:`.zst`), desarrollado por *Facebook*, se basa en la versión `LZ4 `_ de *LZ77*. Su propósito es competir en los mismos usos que :program:`gzip`\ [#]_. Para facilitar su uso, las cuatro órdenes tiene una interfaz de uso común. Compresiones habituales ----------------------- .. _gzip: .. index:: gzip :manpage:`gzip` Su sintaxis básica, análoga a la del resto de compresores es la siguiente:: gzip [] [archivo1 [archivo2 ...]] y su modo de proceder, también. La orden:: $ gzip archivo.txt Convierte el archivo original en el archivo comprimido :file:`archivo.txt.gz`. Obsérvese, pues, que el original se pierde. Si pasamos varios archivos:: $ gzip archivo1.txt archivo2.txt Obtendremos los archivos :file:`archivo1.txt.gz` y :file:`archivo2.txt.gz` comprimidos por separado, ya que la fusión de varios archivos en uno sólo es labor de empaquetación y la realiza un empaquetador como veremos más adelante (:ref:`tar `). Esto lo diferencia de herramientas de compresión típicas de los sistemas windows como :command:`zip` o :command:`rar`, que además de comprimir generan un archivo contenedor para poder incluir distintos archivos en uno sólo. Las opciones más recurrentes de :command:`gzip` son: ``-1``, ... ``-9``: Indica el nivel de compresión desde 1, el nivel más bajo. a 9, el nivel más alto. Cuanto mayor sea el nivel de compresión más pequeño será el resultado, pero más costoso en procesador y tiempo llegar a él. Cuando no se indica ningún nivel explícitamente, se usa ``-6``. ``-c``: Comprime en la salida estándar. Esto permite tanto no perder el archivo original como cambiar el nombre del archivo resultante:: $ gzip -c archivo.txt > archivo.comprimido.txt.gz La opción es obligada cuando no se comprime el contenido de un archivo, sino que al no indicarse ninguno como argumento, se toma el flujo de datos de la entrada estándar:: $ echo "Quiero comprimir esto" | gzip -c > frase.txt.gz ``-t``: Comprueba la integridad de un archivo comprimido:: $ gzip -t frase.txt.gz ``-l``: Devuelve el grado de compresión del archivo y los tamaños antes y después de la compresión:: $ gzip -l frase.txt.gz ``-d`` En vez de comprimir, descomprime. Por ejemplo:: $ gzip -dc frase.txt.gz Quiero comprimir esto $ gzip -d frase.txt.gz $ cat frase.txt Quiero comprimir esto Para la labor de descompresión se puede usar también la variante :command:`gunzip`. .. _gunzip: .. index:: gunzip :manpage:`gunzip` Equivale a :code:`gzip -d`, y por tanto, se usa y admite los mismos comandos que :ref:`gzip `. .. _bzip2: .. index:: bzip2 :manpage:`bzip2` Comprime archivos usando el algoritmo de `Burrows-Wheeler `_. Los archivos comprimidos suelen marcarse con la extensión ``.bz2``. Su forma de funcionamiento y sintaxis son análogos a los de :ref:`gzip ` con lo que no requiere explicaciones adicionales. .. _bunzip2: .. index:: bunzip2 :manpage:`bunzip2` Equivale a :code:`bzip2 -d`, y por tanto, se usa y admite los mismos comandos que :ref:`bzip2 `. .. _xz: .. index:: xz :manpage:`xz` Comprime archivos usando el algoritmo `LZMA `_. Los archivos comprimidos suelen marcarse con la extensión ``.xz``. Su forma de funcionamiento y sintáxis son análogos a los de :ref:`gzip ` y :ref:`bzip2 ` con lo que no requiere explicaciones adicionales. .. _unxz: .. index:: unxz :manpage:`unxz` Equivale a :code:`xz -d`, y por tanto, se usa y admite los mismos comandos que :ref:`xz `. .. _zstd: .. index:: zstd :manpage:`zstd` La diferencia fundamental con el resto de órdenes es que comprime (o descomprime con :kbd:`-d`) sin eliminar el original. Por tanto:: $ zstd archivo creará el archivo :file:`archivo.zst` sin que desaparezca :file:`archivo`. .. _unzstd: .. index:: unzstd :manpage:`unzstd` Equivale a :code:`unzstd -d`. .. note:: Existen, además, las órdenes :command:`zcat`, :command:`bzcat`, :command:`xzcat` y :command:`zstdcat` que descomprimen mostrando por la salida estándar el archivo comprimido a la manera en que lo haría :ref:`cat ` con un archivo de texto. También existen los equivalentes a :ref:`grep `, :ref:`more ` o :ref:`less `. Otros compresores ----------------- Aunque lo habitual es usar alguno de los cuatro compresores arriba descritos, junto a :ref:`tar para poder crear un único archivo contenedor `, en linux están disponibles comandos para poder tratar archivos ``zip`` (:index:`para comprimir ` :manpage:`zip` y :index:`para descomprimir ` :manpage:`unzip`), archivos ``rar`` (:index:`para comprimir ` :command:`rar` y :index:`para descomprimir ` :manpage:`unrar`, aunque ambos están en la rama *non-free*) o archivos ``7z`` (mediante el :index:`comando ` :manpage:`p7zip`). No obstante, no es habitual usarlos y, por lo general, su uso se limita a descomprimir archivos que nos hayan podido proporcionar terceras personas en estos formatos. Por supuesto, también existen herramientas gráficas, que permiten de forma sencilla elegir el formato entre todos los disponibles. .. rubric:: Notas al pie .. [#] Linux, por ejemplo, que tradicionalmente ofrecía descargar las fuentes comprimidas en formatos ``gz`` y ``bz2``, dejó de ofrecer este último formato en `a finales de diciembre de 2013 `_, para pasar a ofrecerlas en ``gz`` y ``xz``. .. [#] En las versiones recientes de *Debian*, el archivo :file:`initrd.img` se comprime con esta herramienta y no con :program:`gzip` como se hacía tradicionalmente:: $ file -b /boot/initrd.img-$(uname -r) Zstandard compressed data (v0.8+), Dictionary ID: None