<!doctype linuxdoc system>
<!-- $Date: 2003/01/03 02:40:54 $ -->

<article>

<title>Mini Howto Bzip2
<author>David Fetter, <htmlurl url="mailto:david@fetter.org"
name="david@fetter.org">;<newline>
Version Française par Arnaud Launay, <htmlurl
url="mailto:asl@launay.org" name="asl@launay.org">
<date>v2.0, 22 août 1999
<abstract>
Ce document vous expliquera comment utiliser le nouveau programme de
compression bzip2. Le document sgml original se trouve <url
url="http://fetter.org/Bzip2-HOWTO/" name="ici">.
</abstract>

<toc>

<sect>Introduction

<p>Bzip2 est un nouvel algorithme délirant de compression de données. Il
produit généralement des fichiers qui ne font que 60 ou 70% de la taille
obtenue par compression par gzip.

<p>Ce document vous montrera quelques applications courantes pour bzip2.

<p>Les futures versions de ce document auront des applications de libbzip2, la
bibliothèque bzip2 en C que l'auteur de bzip2, <url
url="mailto:Julian_Seward@muraroa.demon.co.uk" name="Julian Seward">, a
sympathiquement écrite. Le manuel de bzip2, qui dispose des informations de
bas-niveau, se trouve 
<url
url="http://www.bzip2.org/bzip2/docs/manual_toc.html" name="ici">.

<p>Les futures versions de ce document pourront également inclure un résumé
de la discussion sur l'éventualité (et la méthode) d'utilisation de bzip2 dans
le noyau Linux.

<sect1>Historique des révisions

<sect2> v2.00
<p>
Changement de la section <ref id="bzip2-with-less" name="Utiliser bzip2 avec
less"> pour que les fichiers .tar.bz2 puissent être lus. Merci à <url
url="mailto:mc8644@mclink.it" name="Nicola Fabiano"> pour la correction.
<p>
Mise à jour de l'utilitaire buzzit.
<p>
Mise à jour des informations sur tar.

<sect2> v1.92
<p>
Mise à jour de la section <ref id="bzip2-binaries" name="Obtenir des binaires
de bzip2">, incluant les binaires S.u.S.E.

<sect2> v1.91

<p>
Correction d'une type et clarification de quelques problèmes liés au shell
dans la section <ref id="bzip2-with-tar" name="section sur l'utilisation de
bzip2 avec tar">. Merci à Alessandro Rubini.

<p>
Mise à jour de l'utilitaire buzzit pour ne pas exploser l'archive bzip2 originale.

<p>
Ajout de bgrep, un outil de type zgrep.

<sect2> v1.9

<p> Clarification du problème avec gcc 2.7.*. Merci à Ulrik Dickow de
l'avoir fait remarquer.

<p> Ajout de la manière élégante d'utilisation de tar par Leonard Jean-Marc.

<p> Ajout de la traduction en suédois par Linus &#195;kerlund.

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

<p> Déplacement des traductions vers leur propre section.

<sect2>v1.8

<p> Ajout de buzzit et tar.diff dans le sgml où ils doivent se trouver.
Correction de la ponctuation et de la présentation. Merci à Arnaud Launay
pour m'aider à corriger ma copie. :-)

<p> Suppression du projet xv pour le moment, dû au manque d'intérêt
populaire.

<p> Ajout d'un pense-bête pour les versions futures du document.

<sect2>v1.7 <p> Ajout de l'utilitaire buzzit. Correction du patch pour gnu tar.

<sect2>v1.6 <p> Ajout du truc de TenThumbs pour Netscape.

<p> Egalement, changement de lesspipe.sh d'après sa suggestion. Il doit
mieux fonctionner maintenant.

<sect2>v1.5

<p> Ajout de la traduction en français d'Arnaud Launay, ainsi que son fichier
pour wu-ftpd.

<sect2>v1.4 <p> Ajout de la traduction en japonais de Tetsu Isaji.

<sect2>v1.3 <p> Ajout du .emacs d'Ulrik Dickow pour les 19.30 et plus récents.

<p> (Egalement corrigé le patch jka-compr.el pour emacs d'après sa
suggestion. Oops! Bzip2 ne possède pas encore(?) de drapeau "append").

<sect2>v1.2 <p> Correction du patch pour emacs afin qu'il reconnaisse
automagiquement les fichiers .bz2.

<sect2>v1.1 <p> Ajout du patch pour emacs.

<sect2>v1.0 <p> 1ère version.

<sect>Obtenir bzip2<label id="obt-bzip2">
<p>
La page web de bzip2 se trouve sur le <url url="http://www.bzip2.org/"
name="site britannique">. Le miroir américain est <url
url="http://www.digistar.com/bzip2/index.html" name="ici">.

<sect1>Le Bzip2-HOWTO dans votre langue

<p>Les francophones peuvent se référer aux traductions d'Arnaud Launay. La
version web se trouve <url url="http://www.freenix.org/unix/linux/HOWTO/mini/Bzip2.html"
name="ici">, et vous pouvez utiliser le ftp <url
url="ftp://ftp.traduc.org/pub/HOWTO/FR/Bzip2.gz"
name="ici">. Arnaud peut être contacté par courrier électronique à <url
url="mailto:asl@launay.org" name="cette adresse">.

<p>Les nippons peuvent se référer aux traductions de Tetsu Isaji, <url
url="http://jf.gee.kyoto-u.ac.jp/JF/JF.html" name="ici">. Isaji peut être
joint sur <url url="http://www2s.biglobe.ne.jp/~kaien/" name="sa page
principale">, ou par courrier électronique à <url
url="mailto:isaji@mxu.meshnet.or.jp" name="cette adresse">.

<p>Les suédois peuvent se référer aux traductions de Linus &#195;kerlund
<url url="http://user.tninet.se/~uxm165t/linux&lowbar;doc.html" name="ici">. Linus
peut être contacté par courrier électronique à <url
url="mailto:uxm165t@tninet.se" name="cette adresse">.

<sect1>Obtenir des binaires précompilés de bzip2 <label id="bzip2-binaries">

<p>
Voir la page web.

<sect1>Obtenir les sources de bzip2
<p>Elles se trouvent sur les sites officiels (voir <ref id="obt-bzip2"
name="Obtenir Bzip2"> pour les emplacements.

<sect1>Compiler bzip2 pour votre machine
<p><bf>Si vous avez gcc 2.7.*</bf>, changez la ligne indiquant
<tscreen><verb>
CFLAGS = -O3 -fomit-frame-pointer -funroll-loops
</verb></tscreen>
<p>pour avoir
<tscreen><verb>
CFLAGS = -O2 -fomit-frame-pointer
</verb></tscreen>
<p>C'est-à-dire, remplacez le -O3 par un -O2 et supprimez le -funroll-loops.
Vous pouvez également ajouter une option quelconque du type -m* (comme
-m486, par exemple) que vous utilisez lorsque vous compilez un noyau.
<p>Eviter le -funroll-loops est le plus important, car la plupart des gcc
2.7 généreront le mauvais code, et tous les gcc 2.7 généreront du code plus
lent et plus gros. Pour les autres compileurs (lcc, egcs, gcc 2.8.x) les
CFLAGS par défaut sont bons.
<p>Après ça, lancez simplement <tt/make/ et installez-le d'après le README.

<sect>Utiliser bzip2 lui-même
<p>RTFM (Read the Fine Manual Page). En clair: lisez le manuel.

<sect>Utiliser bzip2 avec tar <label id="bzip2-with-tar">
<p>Sont listés ci-dessous trois méthodes d'utilisation de bzip2 avec tar,
soit:

<sect1>Le plus facile à mettre en place
<p>Cette méthode ne nécessite pas de configurer quoi que ce soit. Pour
décompresser une archive foo.tar.bz2 en bzip2 dans le répertoire courant,
tapez
<tscreen><verb>
/chemin/vers/bzip2 -cd foo.tar.bz2 | tar xf -
</verb></tscreen>
ou
<tscreen><verb>
tar --use-compress-prog=bzip2 xf foo.tar.bz2
</verb></tscreen>

<p>Ceci fonctionne, mais peut être ennuyeux à taper souvent.

<sect1>Facile à mettre en oeuvre, relativement simple à utiliser, pas de nécessité d'avoir les privilèges de super-utilisateur
<p>Merci à <url url="mailto:leonard@sct1.is.belgacom.be" name="Leonard
Jean-Marc"> pour ce truc.
<p>Dans votre .bashrc, vous pouvez mettre une ligne
comme celle-ci:
<tscreen><verb>
alias btar='tar --use-compress-program /usr/local/bin/bzip2 '
</verb></tscreen>

<p>Dans votre .tcshrc, ou .cshrc, la ligne ressemblera à:
<tscreen><verb>
alias btar 'tar --use-compress-program /usr/local/bin/bzip2 '
</verb></tscreen>

<sect1>Aussi simple à utiliser, mais nécessite les privilèges de super-utilisateur
<p>
Mettez votre tar à jour avec la nouvelle version de GNU tar, qui est
aujourd'hui la 1.13.10. On peut le trouver sur <url
url="ftp://alpha.gnu.org/gnu/tar/" name="le site ftp de GNU"> ou tout miroir.

<sect>Utiliser bzip2 avec less<label id="bzip2-with-less">
<p>Pour décompresser les fichiers de bzip2 au vol, c-à-d pour pouvoir
utiliser "less" sur eux sans commencer par les bunzip2-er, vous pouvez créer
un lesspipe.sh (man less) comme celui-ci:
<verb>
#!/bin/sh
# Ceci est un préprocesseur pour 'less'. Il est utilisé lorsque cette
# variable d'environnement existe:  LESSOPEN="|lesspipe.sh %s"

  case "&dollar;1" in
  *.tar) tar tvvf &dollar;1 2>/dev/null ;; # Voir le contenu de fichiers .tar et .tgz
  *.tgz) tar tzvvf &dollar;1 2>/dev/null ;;
# Celui-ci fonctionne pour la version non-modifiée de tar:
  *.tar.bz2) bzip2 -cd &dollar;1 &dollar;1 2>/dev/null | tar tvvf - ;;
# Celui-ci fonctionne avec la version patchée de tar:
# *.tar.bz2) tyvvf &dollar;1 2>/dev/null ;;
  *.tar.gz) tar tzvvf &dollar;1 2>/dev/null ;;
  *.tar.Z) tar tzvvf &dollar;1 2>/dev/null ;;
  *.tar.z) tar tzvvf &dollar;1 2>/dev/null ;;
  *.bz2) bzip2 -dc &dollar;1  2>/dev/null ;; # Voir correctement les fichiers compressés
  *.Z) gzip -dc &dollar;1  2>/dev/null ;;
  *.z) gzip -dc &dollar;1  2>/dev/null ;;
  *.gz) gzip -dc &dollar;1  2>/dev/null ;;
  *.zip) unzip -l &dollar;1 2>/dev/null ;;
  *.1|*.2|*.3|*.4|*.5|*.6|*.7|*.8|*.9|*.n|*.man) FILE=`file -L &dollar;1` ; # groff src
    FILE=`echo &dollar;FILE | cut -d ' ' -f 2`
    if [ "&dollar;FILE" = "troff" ]; then
      groff -s -p -t -e -Tascii -mandoc &dollar;1
    fi ;;
  *) cat &dollar;1 2>/dev/null ;;
#  *) FILE=`file -L &dollar;1` ; # Vérifier si c'est un binaire, alors -> voir avec 'strings'
#    FILE1=`echo &dollar;FILE | cut -d ' ' -f 2`
#    FILE2=`echo &dollar;FILE | cut -d ' ' -f 3`
#    if [ "&dollar;FILE1" = "Linux/i386" -o "&dollar;FILE2" = "Linux/i386" \
#         -o "&dollar;FILE1" = "ELF" -o "&dollar;FILE2" = "ELF" ]; then
#      strings &dollar;1
#    fi ;;
  esac
</verb>

<sect>Utiliser bzip2 avec emacs
<sect1>Changer emacs pour tous
<p>J'ai écrit le patch suivant pour jka-compr.el qui ajoute bzip2 au mode
d'auto-compression.
<p><bf>Avertissement:</bf> Je l'ai uniquement testé avec emacs-20.2, mais je
n'ai pas de raisons de croire qu'une approche similaire ne fonctionnerait pas
avec d'autres versions.
<p>Pour l'utiliser,
<enum>
<item>Allez dans le répertoire des sources emacs-20.2/lisp (quel que soit
l'endroit où il se trouverait décompacté)
<item>Enregistrez le patch ci-dessous dans un fichier nommé
jka-compr.el.diff (il doit être seul dans ce fichier ;).
<item>Faites
<tscreen><verb>
 patch < jka-compr.el.diff
</verb></tscreen>
<item>Lancez emacs, et utilisez
<tscreen><verb>
 M-x byte-compile-file jka-compr.el
</verb></tscreen>
<item>Quittez emacs.
<item>Déplacez votre jka-compr.elc original vers un endroit sûr en cas
d'erreurs.
<item>Remplacez le par le nouveau jka-compr.elc.
<item>Amusez-vous !
</enum>
<verb>
--- 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")

</verb>

<sect1>Changer emacs pour une seule personne

<p>
Merci à Ulrik Dickow, <url url="mailto:ukdATkampsax.dk"
name="ukd@kampsax.dk">, ingénieur système à Kampsax Technology, pour
celui-ci:

Pour faire en sorte de pouvoir utiliser bzip2 automatiquement lorsque vous
n'êtes pas administrateur système, ajoutez simplement ce qui suit à votre
fichier .emacs.

<verb>
;; (Dé)compression automatique pour le chargement/sauvegarde de fichiers
;; (gzip(1) et simililaires)
;; Nous le lançons en état stoppé, ainsi le support pour bzip2(1) peut être
;; ajouté.
;; Codé par Ulrik Dickow pour ~/.emacs avec Emacs 19.34.
;; Doit fonctionner avec beaucoup d'anciens et de nouveaux emacs également.
;; Pas de garantie, cependant.
;;
(if (fboundp 'auto-compression-mode) ; Emacs 19.30+
    (auto-compression-mode 0)
  (require 'jka-compr)
  (toggle-auto-compression 0))
;; Ajouter le support bzip2 et autoriser la compression.
(add-to-list 'jka-compr-compression-info-list
             ["\\.bz2\\(~\\|\\.~[0-9]+~\\)?\\'"
              "zipping"        "bzip2"         ()
              "unzipping"      "bzip2"         ("-d")
              nil t])
(toggle-auto-compression 1 t)

</verb>

<sect>Utiliser bzip2 avec wu-ftpd

<p>
Merci à Arnaud Launay pour ce gain de bande passante. Ce qui suit doit
aller dans /etc/ftpconversions pour faire de la compression et décompression
au vol avec bzip2. Vérifiez que les chemins (comme /bin/compress) sont bons.

<verb>
 :.Z:  :  :/bin/compress -d -c %s:T&lowbar;REG|T&lowbar;ASCII:O&lowbar;UNCOMPRESS:UNCOMPRESS
 :   : :.Z:/bin/compress -c %s:T&lowbar;REG:O&lowbar;COMPRESS:COMPRESS
 :.gz: :  :/bin/gzip -cd %s:T&lowbar;REG|T&lowbar;ASCII:O&lowbar;UNCOMPRESS:GUNZIP
 :   : :.gz:/bin/gzip -9 -c %s:T&lowbar;REG:O&lowbar;COMPRESS:GZIP
 :.bz2: :  :/bin/bzip2 -cd %s:T&lowbar;REG|T&lowbar;ASCII:O&lowbar;UNCOMPRESS:BUNZIP2
 :   : :.bz2:/bin/bzip2 -9 -c %s:T&lowbar;REG:O&lowbar;COMPRESS:BZIP2
 :   : :.tar:/bin/tar -c -f - %s:T&lowbar;REG|T&lowbar;DIR:O&lowbar;TAR:TAR
 :   : :.tar.Z:/bin/tar -c -Z -f -
%s:T&lowbar;REG|T&lowbar;DIR:O&lowbar;COMPRESS|O&lowbar;TAR:TAR+COMPRESS
 :   : :.tar.gz:/bin/tar -c -z -f - %s:T&lowbar;REG|T&lowbar;DIR:O&lowbar;COMPRESS|O&lowbar;TAR:TAR+GZIP
 :   : :.tar.bz2:/bin/tar -c -y -f -
%s:T&lowbar;REG|T&lowbar;DIR:O&lowbar;COMPRESS|O&lowbar;TAR:TAR+BZIP2
</verb>

<sect>Utiliser bzip2 avec Netscape sous X
<p>
tenthumbs@cybernex.net nous dit:

<tscreen>
J'ai également trouvé un moyen pour obtenir l'utilisation de bzip2
par Netscape/Linux pour le Content-Encoding de la même manière qu'il utilise
gzip. Ajoutez ceci à &dollar;HOME/.Xdefaults ou &dollar;HOME/.Xresources.
<p>
J'utilise l'option -s car je préfère perdre un peu de vitesse de
décompression et conserver de la mémoire. Vous pouvez supprimer cette option
si vous le désirez.
</tscreen>

<verb>
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
</verb>

<sect>Utiliser bzip2 pour recompresser en remplacement d'autres formats de compression
<p>
Ce programme perl prend les fichiers compressés
dans d'autres formats (.tar.gz, .tgz. .tar.Z, et .Z pour cette itération) et
les recompresse pour un meilleur résultat. Le source perl dispose de tous
les types de documentation nécessaires sur ce qu'il fait et comment il fait
ce qu'il fait. Cette dernière version prend les fichiers sur la ligne de
commande. Sans argument en ligne de commande, il tente de recomprimer tous les
fichiers du répertoire courant.

<verb>
#!/usr/bin/perl -w

#######################################################
#                                                     #
# Ce programme prend les fichiers compressés et       #
# gzip-és dans le répertoire 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;

@raw = (defined @ARGV)?@ARGV:<*>;

foreach(@raw) {
    next if /^bzip/;
    next unless /\.(tgz|gz|Z)$/;
    push @files, $_;
}
$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 is about $factor% of the size of $_. :",($factor<100)?')':'(',"\n";
        unlink $_;
    } else {
        print "Arrgghh! Quelque chose est arrivé à $_: $!\n";
    }
}
print "Vous avez "
    , ($saved_bytes>=0)?"sauvé ":"perdu "
    , abs($saved_bytes)
    , " octets d'espace 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 système: $!";
$machine_bzip2_total += $saved_bytes;
print TOTAL $machine_bzip2_total;
close TOTAL;

print "Ceci nous donne un total de ",`cat $totals_file`," octets sauvés sur
tout le système.\n";
</verb>

</article>