Bzip2 Howto

David Fetter, dfetter@best.com

v1.6, 10 marzo 1998


Questo documento descrive come usare il nuovo programma di compressione bzip2. L'originale in sgml si trova presso http://www.best.com/~dfetter/Bzip2-HOWTO/Bzip2-HOWTO.sgml.

1. Introduzione

Bzip2 è un nuovo algoritmo per la compressione dei dati. Generalmente crea file che sono il 60-70% della dimensione dei corrispondenti ottenuti usando gzip.

Per mezzo di questo documento potrai utilizzare alcune applicazioni comuni con bzip2.

Per traduzione in francese puoi far riferimeno a documento di Arnaud Launay. Una versione web si trova qui, oppure puoi usare ftp qui Arnaud può essere contattato via posta elettronica a questo indirizzo

Per traduzione in giapponese puoi far riferimento qui ai documenti di Tetsu Isaji. Isaji può essere contattato tramite la sua home page, oppure via posta elettronica a questo indirizzo.

1.1 Storia delle revisioni

v1.6 Aggiunto il Netscape enabler di TenThumbs.

Modificato anche lesspipe.sh secondo i sui suggerimenti. Adesso dovrebbe funzionare meglio.

v1.5 Aggiunta la traduzione francese di Arnaud Launay, e il suo wu-ftpd file.

v1.4 Aggiunta la traduzione giapponese di Tetsu Isaji.

v1.3 Aggiunto .emacs di Ulrik Dickow per 19.30 e superiori.

(Su suo consiglio, corretta anche la patch jka-compr.el per emacs. Oops! Bzip2 non ha ancora(?) un'opzione "append".)

v1.2 Modificata la patch per emacs così riconosce automaticamente i file .bz2.

v1.1 Aggiunta patch per emacs.

v1.0 Prima Versione.

2. Come ottenere bzip2

L'home page di Bzip2 si trova presso l' home site UK. Il sito mirror negli STATI UNITI è qui. Puoi anche trovarlo sul sito della Red Hat qui.

2.1 Ottenere bzip2 precompilato

Vedi gli home site. I binari per Intel della Red Hat si trovano qui. Per la Debian sono qui, e qui per la Slackware. Puoi prenderlo negli analogi posti presso i vari siti mirror.

2.2 Ottenere i sorgenti di bzip2

Sono reperibili dal sito ufficiale (vedi Ottenere Bzip2), oppure qui presso Red Hat.

2.3 Compilare bzip2 per la tua macchina

Se hai gcc 2.7.2.3, cambia la linea

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

in

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

ovvero, togli la parte -O3. Dopo di che semplicemente lancia make e installalo come spiegato nel README.

3. Usare bzip2 da solo

Leggi la raffinata pagina del manuale :)

4. Usare bzip2 con tar

Di base, ci sono due modi di usarlo, chiamiamoli

4.1 Facile impostazione:

questo metodo non richiede un setup generale. Per un-tarare un archivo tar bzip2, foo.tar.bz2, nella corrente directory, fai

/percorso/per/bzip2 -cd foo.tar.bz2 | tar xf -

Questo metodo funziona, ma può essere un po' noioso da scrivere spesso.

4.2 Facile da usare:

Applica la seguente patch a gnu tar 1.12, compilalo, ed installalo, e sei pronto per partire. Assicurati che tar and bzip2 si trovino nel tuo $PATH con "which tar" e "which bzip2". Per usarlo, semplicemente usa

 tar xyf foo.tar.bz2
per decomprimere un file.

Per creare un nuovo archivio, analogamnte:

 tar cyf foo.tar.bz2 file1 file2 file3...directory1 directory2...

E questa è la patch :)

*** 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. Usare bzip2 con less

Per decomprimere i file bzip2 al volo, ad esempio usare "less" senza prima bunziparli, tu puoi fare un lesspipe.sh (man less) simile a questo:

#!/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. Usare bzip2 con emacs

6.1 Cambiare emacs per tutti:

Ho scritto la seguente patch per jka-compr.el la quale aggiunge bzip2 ad auto-compression-mode.

Disclaimer: Io l'ho solo testato con emacs-20.2, ma non c'è nessuna ragione per credere che un simile approccio non funzioni con altre versioni.

Come usarlo

  1. Vai nella directory dei sorgenti emacs-20.2/lisp (oppure dove li hai un-tarati)
  2. Metti la seguente patch in un file chiamato jka-compr.el.diff (deve essere l'unico file ;).
  3. Fai
     patch < jka-compr.el.diff
    
  4. Avvia emacs, e fai
     M-x byte-compile-file jka-compr.el
    
  5. Esci da emacs.
  6. Metti il tuo jka-compr.elc originale in un posto sicuro in caso di bachi.
  7. Sostituisci il nuovo jka-compr.elc.
  8. Hai fatto!
--- 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 Modificare emacs per un solo utente:

Un ringraziamento per questa cosa va a Ulrik Dickow, ukd@kampsax.dk, Programmatore di Sistema presso Kampsax Technology:

Per fare in modo di usare bzip2 autmaticamente, senza essere un sysadmin, aggiungi ciò che segue nel tuo file .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. Usare bzip2 con wu-ftpd

Ringrazio Arnaud Launay per questo salva banda. Ciò che segue va in /etc/ftpconversions per comprimere e decomprimere con bzip2 al volo. Assicurati che i percorsi (simile a /bin/compress) siano giusti.

 :.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. Usare bzip2 con Netscape sotto XWindows

tenthumbs@cybernex.net dice:

Ho trovato un modo di far usare bzip2 al Netscape per Linux per Content-Encoding nello stesso modo con cui usa gzip. Aggiungi quanto segue a $HOME/.Xdefaults oppure $HOME/.Xresources

Io uso l opzione -s poiché preferisco sacrificare un po' di velocità di decompressione piuttosto che l'utilizzo di memoria RAM. Puoi togliere questa opzione se non ne hai bisogno.

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. Usare bzip2 con xv

Sto lavorando ad una patch, in modo tale che xv autodecomprima i file bzip2 nello stesso modo con cui può decomprimere quelli di gzip. Nessuno vuole aiutarmi?