Bzip2 COMO

David Fetter, dfetter@best.com
Traducido por: Joaquín Cuenca Abela, jcuenca@patan.eleinf.uv.es

v1.6 Tue Mar 10 17:48:42 PST 1998


Este documento explica cómo utilizar el nuevo compresor bzip2.

1. Introducción

El texto original (en sgml) se encuentra http://www.best.com/~dfetter/Bzip2-HOWTO/Bzip2-HOWTO.sgml.

Bzip2 está creado con un magnífico nuevo algoritmo sobre compresión de datos. Generalmente consigue que los ficheros queden en un 60-70% del tamaño que tienen los ficheros comprimidos con gzip.

Este documento le llevará a través de unas cuantas aplicaciones para bzip2.

Los franco-hablantes tienen el documento traducido por Arnaud Launay. La versión web está en http://www.freenix.fr/linux/HOWTO/mini/Bzip2.html, y para recoger por ftp ftp://ftp.lip6.fr/pub/linux/french/docs/HOWTO/mini/Bzip2.gz. Puede contactar con Arnaud por correo electrónico zoro@mygale.org.

Aquellos que hablen Japonés pueden utilizar la versión Japonesa, de la mano de Tetsu Isaji, http://jf.gee.kyoto-u.ac.jp/JF/JF.html. La página de Isaji está en http://www2s.biglobe.ne.jp/~kaien/, y su dirección de correo electrónico es isaji@mxu.meshnet.or.jp.

1.1 Memoria de cambios

2. Obtención de bzip2

La página principal de bzip2 está http://www.muraroa.demon.co.uk/. El servidor réplica en los Estados Unidos es http://www.digistar.com/bzip2/index.html. También se puede encontrar en la dirección ftp de Red Hat, ftp://ftp.redhat.com/pub/contrib.

2.1 Obtención de versiones precompiladas de bzip2

Busque en las direcciones de las principales distribuciones. El fichero compilado para intel de Red Hat es ftp://ftp.redhat.com/pub/contrib/i386/bzip2-0.1pl2-1.i386.rpm. El de Debian está ftp://ftp.debian.org/debian/hamm/hamm/binary-i386/utils/bzip2_0.1pl2-4.deb, y la de Slackware está en http://www.cdrom.com/pub/linux/slackware-3.4/slakware/a9/bzip2.tgz.

También puede obtener los ficheros directorios análogos de cualquier servidor réplica.

2.2 Obtención del código fuente de bzip2

El código está en los lugares oficiales (ver la sección Obtención de bzip2 para obtener una lista de las direcciones). Red Hat tiene el código en ftp://ftp.redhat.com/pub/contrib/SRPMS/bzip2-0.1pl2-1.src.rpm.

2.3 Compilación de bzip2 en su ordenador

Si tiene gcc 2.7.2.3, cambie la línea que pone

CFLAGS = -O3 -fomit-frame-pointer -funroll-loops

a

CFLAGS = -fomit-frame-pointer -funroll-loops

osea, quite el -O3. Después de haber hecho ésto, sólo tiene que hacer un make e instalarlo siguiendo las instrucciones del fichero README.

3. Utilización de bzip2

Lea la bonita página man :)

4. Utilización conjunta con tar

Básicamente, hay dos formas de combinar bzip2 con tar:

4.1 Forma fácil que configurar:

Este método no necesita configurar nada. Para desempaquetar un fichero .tar.gz, digamos algo.tar.bz, en el directorio actual, debemos hacer

 
/directorio/de/bzip2 -cd algo.tar.bz2 | tar xf -

Este método funciona, pero puede ser un poco pesado teclearlo todo cada vez que se necesite descomprimir algo.

4.2 Forma fácil de usar:

Aplique el siguiente parche a gnu tar 1.12, compílelo, instálelo, y se acabó. Asegúrese de que tanto tar como bzip2 están en su $PATH con

which tar
which bzip2

Para utilizarlo, sólo tiene que hacer

tar xyf algo.tar.bz2

para descomprimir el fichero.

Para hacer un nuevo fichero comprimido hay que hacer algo parecido:

 tar cyf algo.tar.bz2 fichero1 fichero2 fichero3...directorio1 directorio2...

Y aquí está el parche :)

*** tar.c.orig  Sat Apr 26 05:09:49 1997
--- tar.c       Feb  2 00:50:47 1998
***************
*** 16,21 ****
--- 16,24 ----
     with this program; if not, write to the Free Software Foundation, Inc.,
     59 Place - Suite 330, Boston, MA 02111-1307, USA.  */

+ /* Feb 2 98: patched by David Fetter to use bzip2 as a
+              filter (option -y) */
+
  #include "system.h"

  #include <getopt.h>
***************
*** 196,201 ****
--- 199,206 ----
    {"block-number", no_argument, NULL, 'R'},
    {"block-size", required_argument, NULL, OBSOLETE_BLOCKING_FACTOR},
    {"blocking-factor", required_argument, NULL, 'b'},
+   {"bzip2", required_argument, NULL, 'y'},
+   {"bunzip2", required_argument, NULL, 'y'},
    {"catenate", no_argument, NULL, 'A'},
    {"checkpoint", no_argument, &checkpoint_option, 1},
    {"compare", no_argument, NULL, 'd'},
***************
*** 372,377 ****
--- 377,383 ----
                PATTERN                at list/extract time, a globbing PATTERN\n\
    -o, --old-archive, --portability   write a V7 format archive\n\
        --posix                        write a POSIX conformant archive\n\
+   -y, --bzip2, --bunzip2             filter the archive through bzip2\n\
    -z, --gzip, --ungzip               filter the archive through gzip\n\
    -Z, --compress, --uncompress       filter the archive through compress\n\
        --use-compress-program=PROG    filter through PROG (must accept -d)\n"),
***************
*** 448,454 ****
     Y  per-block gzip compression */

  #define OPTION_STRING \
!   "-01234567ABC:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hiklmoprstuvwxz"

  static void
  set_subcommand_option (enum subcommand subcommand)
--- 454,460 ----
     Y  per-block gzip compression */

  #define OPTION_STRING \
!   "-01234567ABC:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hiklmoprstuvwxyz"

  static void
  set_subcommand_option (enum subcommand subcommand)
***************
*** 805,810 ****
--- 811,820 ----
        case 'X':
        exclude_option = 1;
        add_exclude_file (optarg);
+       break;
+
+       case 'y':
+       set_use_compress_program_option ("bzip2");
        break;

        case 'z':

5. Utilización de bzip2 con less

Para descomprimir los ficheros bzip2 al vuelo, esto es, para ser capaces de utilizar less en estos ficheros sin tener primero que descomprimirlos, podemos crear un lesspipe.sh (página man de less) como éste:

#!/bin/sh
# This is a preprocessor for 'less'.  It is used when this environment
# variable is set:   LESSOPEN="|lesspipe.sh %s"

  case "$1" in
  *.tar) tar tvvf $1 2>/dev/null ;; # View contents of various tar'd files
  *.tgz) tar tzvvf $1 2>/dev/null ;;
# This one work for the unmodified version of tar:
  *.tar.bz2) bzip2 -cd $1 $1 2>/dev/null | tar tzvvf - ;;
#This one works with the patched version of tar:
# *.tar.bz2) tyvvf $1 2>/dev/null ;;
  *.tar.gz) tar tzvvf $1 2>/dev/null ;;
  *.tar.Z) tar tzvvf $1 2>/dev/null ;;
  *.tar.z) tar tzvvf $1 2>/dev/null ;;
  *.bz2) bzip2 -dc $1  2>/dev/null ;; # View compressed files correctly
  *.Z) gzip -dc $1  2>/dev/null ;;
  *.z) gzip -dc $1  2>/dev/null ;;
  *.gz) gzip -dc $1  2>/dev/null ;;
  *.zip) unzip -l $1 2>/dev/null ;;
  *.1|*.2|*.3|*.4|*.5|*.6|*.7|*.8|*.9|*.n|*.man) FILE=`file -L $1` ; # groff src
    FILE=`echo $FILE | cut -d ' ' -f 2`
    if [ "$FILE" = "troff" ]; then
      groff -s -p -t -e -Tascii -mandoc $1
    fi ;;
  *) cat $1 2>/dev/null ;;
#  *) FILE=`file -L $1` ; # Check to see if binary, if so -- view with 'strings'
#    FILE1=`echo $FILE | cut -d ' ' -f 2`
#    FILE2=`echo $FILE | cut -d ' ' -f 3`
#    if [ "$FILE1" = "Linux/i386" -o "$FILE2" = "Linux/i386" \
#         -o "$FILE1" = "ELF" -o "$FILE2" = "ELF" ]; then
#      strings $1
#    fi ;;
  esac

6. Utilización de bzip2 con emacs

6.1 Cambio de emacs para todos:

He escrito el siguiente parche para jka-compr.el que añade bzip2 al auto-compression-mode.

Renuncia: Sólo lo he comprobado con emacs-20.2, pero no tengo ninguna razón para creer que un parche parecido no pueda funcionar con otras versiones.

Para utilizarlo,

  1. Vaya al directorio emacs-20.2/lisp (o donde lo haya desempaquetado)
  2. Ponga el parche en un fichero llamado jka-compr.el.diff (en este fichero sólo debe estar el parche ;)
  3. Haga
     patch < jka-compr.el.diff
    
  4. Ejecute emacs, y haga
     M-x byte-compile-file jka-compr.el
    
  5. Salga de emacs.
  6. Cambie su fichero jka-compr.elc original a un lugar seguro para evitar fallos.
  7. Cámbielo con el nuevo jka-compr.elc.
  8. ¡Diviértase!

--- jka-compr.el        Sat Jul 26 17:02:39 1997
+++ jka-compr.el.new    Thu Feb  5 17:44:35 1998
@@ -44,7 +44,7 @@
 ;; The variable, jka-compr-compression-info-list can be used to
 ;; customize jka-compr to work with other compression programs.
 ;; The default value of this variable allows jka-compr to work with
-;; Unix compress and gzip.
+;; Unix compress and gzip.  David Fetter added bzip2 support :)
 ;;
 ;; If you are concerned about the stderr output of gzip and other
 ;; compression/decompression programs showing up in your buffers, you
@@ -121,7 +121,9 @@
 
 
 ;;; I have this defined so that .Z files are assumed to be in unix
-;;; compress format; and .gz files, in gzip format.
+;;; compress format; and .gz files, in gzip format, and .bz2 files,
+;;; in the snappy new bzip2 format from http://www.muraroa.demon.co.uk.
+;;; Keep up the good work, people!
 (defcustom jka-compr-compression-info-list
   ;;[regexp
   ;; compr-message  compr-prog  compr-args
@@ -131,6 +133,10 @@
      "compressing"    "compress"     ("-c")
      "uncompressing"  "uncompress"   ("-c")
      nil t]
+    ["\\.bz2\\'"
+     "bzip2ing"        "bzip2"         ("")
+     "bunzip2ing"      "bzip2"         ("-d")
+     nil t]
     ["\\.tgz\\'"
      "zipping"        "gzip"         ("-c" "-q")
      "unzipping"      "gzip"         ("-c" "-q" "-d")

6.2 Cambiar emacs para uno mismo:

Este truco se lo tengo que agradecer a Ulrick Dickow, ukd@kampsax.dk, programador de sistemas en Kampsax Technology:

Para hacer que se pueda utilizar bzip2 automáticamente cuando no es el administrador del sistema, sólo tiene que añadir lo siguiente al fichero .emacs:

;; Automatic (un)compression on loading/saving files (gzip(1) and similar)
;; We start it in the off state, so that bzip2(1) support can be added.
;; Code thrown together by Ulrik Dickow for ~/.emacs with Emacs 19.34.
;; Should work with many older and newer Emacsen too.  No warranty though.
;;
(if (fboundp 'auto-compression-mode) ; Emacs 19.30+
    (auto-compression-mode 0)
  (require 'jka-compr)
  (toggle-auto-compression 0))
;; Now add bzip2 support and turn auto compression back on.
(add-to-list 'jka-compr-compression-info-list
             ["\\.bz2\\(~\\|\\.~[0-9]+~\\)?\\'"
              "zipping"        "bzip2"         ()
              "unzipping"      "bzip2"         ("-d")
              nil t])
(toggle-auto-compression 1 t)

7. Utilización de bzip2 con wu-ftpd

Gracias a Arnaud Launay por su truco para ahorrar ancho de banda. Lo siguiente debería ir en /etc/ftpconversions para compresiones y descompresiones al vuelo con bzip2. Asegúrese de que las direcciones (como /bin/compress) son correctas.

 :.Z:  :  :/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS
 :   : :.Z:/bin/compress -c %s:T_REG:O_COMPRESS:COMPRESS
 :.gz: :  :/bin/gzip -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:GUNZIP
 :   : :.gz:/bin/gzip -9 -c %s:T_REG:O_COMPRESS:GZIP
 :.bz2: :  :/bin/bzip2 -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:BUNZIP2
 :   : :.bz2:/bin/bzip2 -9 -c %s:T_REG:O_COMPRESS:BZIP2
 :   : :.tar:/bin/tar -c -f - %s:T_REG|T_DIR:O_TAR:TAR
 :   : :.tar.Z:/bin/tar -c -Z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS
 :   : :.tar.gz:/bin/tar -c -z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP
 :   : :.tar.bz2:/bin/tar -c -I -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+BZIP2

8. Utilización de bzip2 con Netscape en XWindows

tenthumbs@cybernex.net dijo:

He encontrado una forma de hacer que Netscape (en Linux) utilice bzip2 en Content-Encoding como si estuviese utilizando gzip. Añada ésto a $HOME/.Xdefaults o $HOME/.Xresources

Yo utilizo la opción -s porque prefiero cambiar algo de velocidad en la descompresión por memoria RAM. Puede quitar la opción si lo prefiere.

Netscape*encodingFilters:      \
        x-compress :  : .Z     : uncompress -c  \n\
        compress   :  : .Z     : uncompress -c  \n\
        x-gzip     :  : .z,.gz : gzip -cdq      \n\
        gzip       :  : .z,.gz : gzip -cdq      \n\
        x-bzip2    :  : .bz2   : bzip2 -ds \n

9. Utilización de bzip2 con xv

Estoy trabajando en un parche que debe hacer que xv auto-descomprima los ficheros .bzip2 tal y como lo hace con los ficheros comprimidos mediante gzip o compress. ¿Quiere ayudarme alguien?

10. Anexo: El INSFLUG

El INSFLUG forma parte del grupo internacional Linux Documentation Project, encargándose de las traducciones al castellano de los Howtos (Comos), así como la producción de documentos originales en aquellos casos en los que no existe análogo en inglés.

En el INSFLUG se orienta preferentemente a la traducción de documentos breves, como los COMOs y PUFs (Preguntas de Uso Frecuente, las FAQs. :) ), etc.

Diríjase a la sede del INSFLUG para más información al respecto.

En la sede del INSFLUG encontrará siempre las últimas versiones de las traducciones: www.insflug.org. Asegúrese de comprobar cuál es la última versión disponible en el Insflug antes de bajar un documento de un servidor réplica.

Se proporciona también una lista de los servidores réplica (mirror) del Insflug más cercanos a Vd., e información relativa a otros recursos en castellano.

Francisco José Montilla, pacopepe@insflug.org.