  Howto Bzip2
  David Fetter, dfetter@best.com;
  Version Francaise par Arnaud Launay, zoro@lsol.tm.fr
  v1.9, 29 Juin 1998

  Ce  document  vous expliquera comment utiliser le nouveau programme de
  compression  bzip2.  Le  document  sgml   original   se   trouve   ici
  <http://www.best.com/~dfetter/Bzip2-HOWTO/Bzip2-HOWTO.sgml>.

  11..  IInnttrroodduuccttiioonn

  Bzip2  est un nouvel algorithme delirant de compression de donnees. Il
  produit generalement des fichiers qui ne font que  60  ou  70%  de  la
  taille obtenue par compression par gzip.

  Ce  document vous montrera quelques applications courantes pour bzip2.

  Les futures versions de ce document discuteront de la librairie  bzip2
  a     venir,     que     l'auteur     de    bzip2,    Julian    Seward
  <mailto:Julian_Seward@muraroa.demon.co.uk>, decrit comme suit:

  Je travaille actuellement sur la prochaine version de bzip2, qui utilisera
  le meme format de fichier .bz2; le principal ajout sera une librairie du
  style zlib pour lire et ecrire des donnees dans ce format a partir d'autres
  programmes.

  Les futures versions de ce  document  pourront  egalement  inclure  un
  resume  de la discussion sur l'eventualite et la methode d'utilisation
  de bzip2 dans le noyau Linux.

  11..11..  HHiissttoorriiqquuee ddeess rreevviissiioonnss

  11..11..11..  vv11..99

  Clarification du probleme avec gcc 2.7.*.  Merci  a  Ulrik  Dickow  de
  l'avoir fait remarquer.

  Ajout  de  la  maniere elegante d'utilisation de tar par Leonard Jean-
  Marc.

  Ajout de la traduction en suedois par Linus kerlund.

  Correction de la section wu-ftpd sur la suggestion d'Arnaud Launay.

  Deplacement des traductions vers leur propre section.

  11..11..22..  vv11..88

  Ajout de buzzit et tar.diff dans le sgml ou ils  doivent  se  trouver.
  Correction  de  la  ponctuation  et de la presentation. Merci a Arnaud
  Launay pour m'aider a corriger ma copie. :-)

  Suppression du projet xv  pour  le  moment,  du  au  manque  d'interet
  populaire.

  Ajout d'un pense-bete pour les versions futures du document.

  11..11..33..  vv11..77

  Ajout de l'utilitaire buzzit. Correction du patch pour gnu tar.

  11..11..44..  vv11..66

  Ajout du truc de TenThumbs pour Netscape.

  Egalement,  changement  de  lesspipe.sh d'apres sa suggestion. Il doit
  mieux fonctionner maintenant.

  11..11..55..  vv11..55

  Ajout de la traduction en francais  d'Arnaud  Launay,  ainsi  que  son
  fichier pour wu-ftpd.

  11..11..66..  vv11..44

  Ajout de la traduction en japonais de Tetsu Isaji.

  11..11..77..  vv11..33

  Ajout du .emacs d'Ulrik Dickow pour les 19.30 et plus recents.

  (Egalement  corrige  le  patch  jka-compr.el  pour  emacs  d'apres  sa
  suggestion. Oops! Bzip2 ne possede pas encore(?) de drapeau "append").

  11..11..88..  vv11..22

  Correction  du patch pour emacs afin qu'il reconnaisse automagiquement
  les fichiers .bz2.

  11..11..99..  vv11..11

  Ajout du patch pour emacs.

  11..11..1100..  vv11..00

  1ere version.

  22..  OObbtteenniirr bbzziipp22

  La  page  web  de  bzip2   se   trouve   sur   le   site   britannique
  <http://www.muraroa.demon.co.uk/>.   Le   miroir   americain  est  ici
  <http://www.digistar.com/bzip2/index.html>. Vous pouvez  egalement  le
  trouver sur le ftp de Red Hat, ici <ftp://ftp.redhat.com/pub/contrib>.

  22..11..  LLee BBzziipp22--HHOOWWTTOO ddaannss vvoottrree llaanngguuee

  Les francophones peuvent se referer aux traductions  d'Arnaud  Launay.
  La          version          web         se         trouve         ici
  <http://www.freenix.fr/linux/HOWTO/mini/Bzip2.html>,  et  vous  pouvez
  utiliser                  le                  ftp                  ici
  <ftp://ftp.lip6.fr/pub/linux/french/docs/HOWTO/mini/Bzip2.gz>.  Arnaud
  peut   etre   contacte  par  courrier  electronique  a  cette  adresse
  <mailto:zoro@lsol.tm.fr>.

  Les nippons peuvent se referer aux traductions  de  Tetsu  Isaji,  ici
  <http://jf.gee.kyoto-u.ac.jp/JF/JF.html>. Isaji peut etre joint sur sa
  page principale <http://www2s.biglobe.ne.jp/~kaien/>, ou par  courrier
  electronique a cette adresse <mailto:isaji@mxu.meshnet.or.jp>.

  Les  suedois  peuvent  se referer aux traductions de Linus kerlund ici
  <http://user.tninet.se/~uxm165t/linux_doc.html>.   Linus   peut   etre
  contacte     par     courrier    electronique    a    cette    adresse
  <mailto:uxm165t@tninet.se>.

  22..22..  OObbtteenniirr ddeess bbiinnaaiirreess pprreeccoommppiilleess ddee bbzziipp22

  Voyez les sites principaux. Le binaire Intel  pour  Red  Hat  est  ici
  <ftp://ftp.redhat.com/pub/contrib/i386/bzip2-0.1pl2-1.i386.rpm>.    Le
  Debian    est    ici    <ftp://ftp.debian.org/debian/hamm/hamm/binary-
  i386/utils/bzip2_0.1pl2-4.deb>,    et    le    slackware    est    ici
  <http://www.cdrom.com/pub/linux/slackware-3.4/slakware/a9/bzip2.tgz>.
  Vous  pouvez  aussi  les  obtenir  d'endroits analogues sur les divers
  sites miroirs.

  22..33..  OObbtteenniirr lleess ssoouurrcceess ddee bbzziipp22

  Elles se trouvent sur les sites officiels (voir ``Obtenir Bzip2'' pour
  les     emplacements,     ou     Red     Hat     en     dispose    ici
  <ftp://ftp.redhat.com/pub/contrib/SRPMS/bzip2-0.1pl2-1.src.rpm>).

  22..44..  CCoommppiilleerr bbzziipp22 ppoouurr vvoottrree mmaacchhiinnee

  SSii vvoouuss aavveezz ggcccc 22..77..**, changez la ligne indiquant

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

  pour avoir

       CFLAGS = -O2 -fomit-frame-pointer

  C'est-a-dire, remplacez le -O3 par un -O2 et  supprimez  le  -funroll-
  loops.   Vous  pouvez  egalement ajouter une option quelconque du type
  -m* (comme -m486, par exemple) que vous utilisez lorsque vous compilez
  un noyau.

  Eviter le -funroll-loops est le plus important, car la plupart des gcc
  2.7 genereront le mauvais code, et tous les gcc 2.7 genereront du code
  plus  lent  et  plus  gros. Pour les autres compileurs (lcc, egcs, gcc
  2.8.x) les CFLAGS par defaut sont bons.

  Apres ca, lancez simplement make et installez-le d'apres le README.

  33..  UUttiilliisseerr bbzziipp22 lluuii--mmeemmee

  RTFM (Read the Fine Manual Page). En clair: lisez le manuel.

  44..  UUttiilliisseerr bbzziipp22 aavveecc ttaarr

  Sont listes ci-dessous trois methodes d'utilisation de bzip2 avec tar,
  soit:

  44..11..  LLee pplluuss ffaacciillee aa mmeettttrree eenn ppllaaccee

  Cette  methode  ne  necessite pas de configurer quoi que ce soit. Pour
  decompresser une archive  foo.tar.bz2  en  bzip2  dans  le  repertoire
  courant, tapez

       /chemin/vers/bzip2 -cd foo.tar.bz2 | tar xf -

  Ceci fonctionne, mais peut etre ennuyeux a taper souvent.

  44..22..   FFaacciillee  aa mmeettttrree eenn ooeeuuvvrree,, rreellaattiivveemmeenntt ssiimmppllee aa uuttiilliisseerr,, ppaass
  ddee nneecceessssiittee dd''aavvooiirr lleess pprriivviilleeggeess ddee ssuuppeerr--uuttiilliissaatteeuurr

  Merci a Leonard Jean-Marc <mailto:leonard@sct1.is.belgacom.be> pour ce
  truc.

  Dans  votre  .bashrc  (ou  .tcshrc,  ou .cshrc) vous pouvez mettre une
  ligne comme celle-ci:

       alias btar='tar --use-compress-program /usr/local/bin/bzip2 '

  44..33..  AAuussssii ssiimmppllee aa uuttiilliisseerr,, mmaaiiss nneecceessssiittee lleess pprriivviilleeggeess ddee ssuuppeerr--
  uuttiilliissaatteeuurr

  Appliquez la correction suivande au gnu tar 1.12 comme suit:

       cd tar-1.12/src; patch < /chemin/vers/tar.diff

  compilez le, et installez le, et tout sera  impeccable.  Verifiez  que
  tar  et  bzip2 soient tous 2 dans votre $PATH en executant "which tar"
  et "which bzip2". Pour utiliser le nouveau tar, faites juste

   tar xyf foo.tar.bz2

  pour decompresser le fichier.

  Pour creer une nouvelle archive, le fonctionnement est similaire:

        tar cyf foo.tar.bz2 fichier1 fichier2 fichier3...repertoire1 repertoire2...

  Voici la correction:

  *** tar.c       Thu Jun 11 00:09:23 1998
  --- tar.c.new   Thu Jun 11 00:14:24 1998
  ***************
  *** 196,201 ****
  --- 196,203 ----
      {"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 ****
  --- 374,380 ----
                  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)
  --- 451,457 ----
       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 ****
  --- 808,817 ----
          case 'X':
          exclude_option = 1;
          add_exclude_file (optarg);
  +       break;
  +
  +       case 'y':
  +       set_use_compress_program_option ("bzip2");
          break;

          case 'z':

  55..  UUttiilliisseerr bbzziipp22 aavveecc lleessss

  Pour decompresser les fichiers de bzip2 au  vol,  c-a-d  pour  pouvoir
  utiliser "less" sur eux sans commencer par les bunzip2-er, vous pouvez
  creer un lesspipe.sh (man less) comme celui-ci:

  #!/bin/sh
  # Ceci est un preprocesseur pour 'less'. Il est utilise lorsque cette
  # variable d'environnement existe:  LESSOPEN="|lesspipe.sh %s"

    case "$1" in
    *.tar) tar tvvf $1 2>/dev/null ;; # Voir le contenu de fichiers .tar et .tgz
    *.tgz) tar tzvvf $1 2>/dev/null ;;
  # Celui-ci fonctionne pour la version non-modifiee de tar:
    *.tar.bz2) bzip2 -cd $1 $1 2>/dev/null | tar tzvvf - ;;
  # Celui-ci fonctionne avec la version patchee de 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 ;; # Voir correctement les fichiers compresses
    *.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` ; # Verifier si c'est un binaire, alors -> voir avec '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6..  UUttiilliisseerr bbzziipp22 aavveecc eemmaaccss

  66..11..  CChhaannggeerr eemmaaccss ppoouurr ttoouuss

  J'ai ecrit le patch suivant pour jka-compr.el qui ajoute bzip2 au mode
  d'auto-compression.

  AAvveerrttiisssseemmeenntt::  Je l'ai uniquement teste avec emacs-20.2, mais je n'ai
  pas de raisons de croire qu'une approche similaire  ne  fonctionnerait
  pas avec d'autres versions.

  Pour l'utiliser,

  1. Allez dans le repertoire des sources emacs-20.2/lisp (quel que soit
     l'endroit ou il se trouverait decompacte)

  2. Enregistrez  le  patch  ci-dessous  dans  un  fichier  nomme   jka-
     compr.el.diff (il doit etre seul dans ce fichier ;).

  3. Faites

        patch < jka-compr.el.diff

  4. Lancez emacs, et utilisez

   M-x byte-compile-file jka-compr.el

  5. Quittez emacs.

  6. Deplacez  votre  jka-compr.elc  original vers un endroit sur en cas
     d'erreurs.

  7. Remplacez le par le nouveau jka-compr.elc.

  8. Amusez-vous !

     --- 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6..22..  CChhaannggeerr eemmaaccss ppoouurr uunnee sseeuullee ppeerrssoonnnnee

  Merci  a  Ulrik   Dickow,   ukd@kampsax.dk   <mailto:ukdATkampsax.dk>,
  ingenieur systeme a Kampsax Technology, pour celui-ci:

  Pour  faire en sorte de pouvoir utiliser bzip2 automatiquement lorsque
  vous n'etes pas administrateur systeme, ajoutez simplement ce qui suit
  a votre fichier .emacs.

  ;; (De)compression automatique pour le chargement/sauvegarde de fichiers
  ;; (gzip(1) et simililaires)
  ;; Nous le lancons en etat stoppe, ainsi le support pour bzip2(1) peut etre
  ;; ajoute.
  ;; Code par Ulrik Dickow pour ~/.emacs avec Emacs 19.34.
  ;; Doit fonctionner avec beaucoup d'anciens et de nouveaux emacs egalement.
  ;; Pas de garantie, cependant.
  ;;
  (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7..  UUttiilliisseerr bbzziipp22 aavveecc wwuu--ffttppdd

  Merci a Arnaud Launay pour ce gain de bande passante. Ce qui suit doit
  aller  dans  /etc/ftpconversions  pour  faire  de  la  compression  et
  decompression  au  vol  avec  bzip2.  Verifiez  que les chemins (comme
  /bin/compress) sont bons.

   :.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 -y -f -
  %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+BZIP2

  88..  UUttiilliisseerr bbzziipp22 aavveecc NNeettssccaappee ssoouuss XX

  tenthumbs@cybernex.net nous dit:

       J'ai egalement trouve un moyen pour obtenir l'utilisation de bzip2 par
       Netscape/Linux  pour  le  Content-Encoding  de  la  meme maniere qu'il
       utilise gzip. Ajoutez ceci a $HOME/.Xdefaults ou $HOME/.Xresources.

       J'utilise l'option -s car je prefere  perdre  un  peu  de  vitesse  de
       decompression  et conserver de la memoire. Vous pouvez supprimer cette
       option si vous le desirez.

  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9..  UUttiilliisseerr bbzziipp22 ppoouurr rreeccoommpprreesssseerr eenn rreemmppllaacceemmeenntt dd''aauuttrreess  ffoorrmmaattss
  ddee ccoommpprreessssiioonn

  Ce programme perl prend les fichiers compresses dans d'autres  formats
  (.tar.gz, .tgz. .tar.Z, et .Z pour cette iteration) et les recompresse
  pour un meilleur resultat. Le source perl dispose de tous les types de
  documentation  necessaires  sur  ce  qu'il  fait et comment il fait ce
  qu'il fait.

  #!/usr/bin/perl -w

  #######################################################
  #                                                     #
  # Ce programme prend les fichiers compresses et       #
  # gzip-es dans le repertoire courant et les tranforme #
  # en fichiers bzip2. Il supporte proprement           #
  # l'extension .tgz, produisant un fichier .tar.bz2.   #
  #                                                     #
  #######################################################
  $counter = 0;
  $saved_bytes = 0;
  $totals_file = '/tmp/machine_bzip2_total';
  $machine_bzip2_total = 0;

  @files = <*[Zz]>;
  $total = scalar(@files);

  foreach (@files) {
      if (/tgz$/) {
          ($new=$_) =~ s/tgz$/tar.bz2/;
      } else {
          ($new=$_) =~ s/\.g?z$/.bz2/i;
      }
      $orig_size = (stat $_)[7];
      ++$counter;
      print "Recompacte $_ ($counter/$total)...\n";
      if ((system "gzip -cd $_ |bzip2 >$new") == 0) {
          $new_size = (stat $new)[7];
          $factor = int(100*$new_size/$orig_size+.5);
          $saved_bytes += $orig_size-$new_size;
          print "$new fait environ $factor% de la taille de $_. :",($factor<100)?')':'(',"\n";
          unlink $_;
      } else {
          print "Arrgghh!  Quelque chose est arrive a $_: $!\n";
      }
  }
  print "Vous avez ",
        ($saved_bytes>=0)?"sauve":"perdu",
        " $saved_bytes octets de place disque :",
         ($saved_bytes>=0)?")":"(", "\n";

  unless (-e '/tmp/machine_bzip2_total') {
      system ('echo "0" >/tmp/machine_bzip2_total');
      system ('chmod', '0666', '/tmp/machine_bzip2_total');
  }

  chomp($machine_bzip2_total = `cat $totals_file`);
  open TOTAL, ">$totals_file"
       or die "Ne peut ouvrir le total sur tout le systeme: $!";
  $machine_bzip2_total += $saved_bytes;
  print TOTAL $machine_bzip2_total;
  close TOTAL;

  print "Ceci nous donne un total de ",`cat $totals_file`," octets sauves sur tout le systeme.\n";

