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.
Ce document vous montrera quelques applications courantes pour bzip2.
Les futures versions de ce document auront des applications de libbzip2, la biblioth�que bzip2 en C que l'auteur de bzip2, Julian Seward, a sympathiquement �crite. Le manuel de bzip2, qui dispose des informations de bas-niveau, se trouve ici.
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.
Changement de la section Utiliser bzip2 avec less pour que les fichiers .tar.bz2 puissent �tre lus. Merci � Nicola Fabiano pour la correction.
Mise � jour de l'utilitaire buzzit.
Mise � jour des informations sur tar.
Mise � jour de la section Obtenir des binaires de bzip2, incluant les binaires S.u.S.E.
Correction d'une type et clarification de quelques probl�mes li�s au shell dans la section section sur l'utilisation de bzip2 avec tar. Merci � Alessandro Rubini.
Mise � jour de l'utilitaire buzzit pour ne pas exploser l'archive bzip2 originale.
Ajout de bgrep, un outil de type zgrep.
Clarification du probl�me avec gcc 2.7.*. Merci � Ulrik Dickow de l'avoir fait remarquer.
Ajout de la mani�re �l�gante d'utilisation de tar par Leonard Jean-Marc.
Ajout de la traduction en su�dois par Linus �kerlund.
Correction de la section wu-ftpd sur la suggestion d'Arnaud Launay.
D�placement des traductions vers leur propre section.
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. :-)
Suppression du projet xv pour le moment, d� au manque d'int�r�t populaire.
Ajout d'un pense-b�te pour les versions futures du document.
Ajout de l'utilitaire buzzit. Correction du patch pour gnu tar.
Ajout du truc de TenThumbs pour Netscape.
Egalement, changement de lesspipe.sh d'apr�s sa suggestion. Il doit mieux fonctionner maintenant.
Ajout de la traduction en fran�ais d'Arnaud Launay, ainsi que son fichier pour wu-ftpd.
Ajout de la traduction en japonais de Tetsu Isaji.
Ajout du .emacs d'Ulrik Dickow pour les 19.30 et plus r�cents.
(Egalement corrig� le patch jka-compr.el pour emacs d'apr�s sa suggestion. Oops! Bzip2 ne poss�de pas encore(?) de drapeau "append").
Correction du patch pour emacs afin qu'il reconnaisse automagiquement les fichiers .bz2.
Ajout du patch pour emacs.
1�re version.
La page web de bzip2 se trouve sur le site britannique. Le miroir am�ricain est ici.
Les francophones peuvent se r�f�rer aux traductions d'Arnaud Launay. La version web se trouve ici, et vous pouvez utiliser le ftp ici. Arnaud peut �tre contact� par courrier �lectronique � cette adresse.
Les nippons peuvent se r�f�rer aux traductions de Tetsu Isaji, ici. Isaji peut �tre joint sur sa page principale, ou par courrier �lectronique � cette adresse.
Les su�dois peuvent se r�f�rer aux traductions de Linus �kerlund ici. Linus peut �tre contact� par courrier �lectronique � cette adresse.
Voir la page web.
Elles se trouvent sur les sites officiels (voir Obtenir Bzip2 pour les emplacements.
Si vous avez gcc 2.7.*, changez la ligne indiquant
CFLAGS = -O3 -fomit-frame-pointer -funroll-loops
pour avoir
CFLAGS = -O2 -fomit-frame-pointer
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.
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.
Apr�s �a, lancez simplement make
et installez-le d'apr�s le README.
RTFM (Read the Fine Manual Page). En clair: lisez le manuel.
Sont list�s ci-dessous trois m�thodes d'utilisation de bzip2 avec tar, soit:
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
/chemin/vers/bzip2 -cd foo.tar.bz2 | tar xf -
ou
tar --use-compress-prog=bzip2 xf foo.tar.bz2
Ceci fonctionne, mais peut �tre ennuyeux � taper souvent.
Merci � Leonard Jean-Marc pour ce truc.
Dans votre .bashrc, vous pouvez mettre une ligne comme celle-ci:
alias btar='tar --use-compress-program /usr/local/bin/bzip2 '
Dans votre .tcshrc, ou .cshrc, la ligne ressemblera �:
alias btar 'tar --use-compress-program /usr/local/bin/bzip2 '
Mettez votre tar � jour avec la nouvelle version de GNU tar, qui est aujourd'hui la 1.13.10. On peut le trouver sur le site ftp de GNU ou tout miroir.
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:
#!/bin/sh # Ceci est un pr�processeur pour 'less'. Il est utilis� 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-modifi�e de tar: *.tar.bz2) bzip2 -cd $1 $1 2>/dev/null | tar tvvf - ;; # Celui-ci fonctionne avec la version patch�e 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 compress�s *.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` ; # V�rifier 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
J'ai �crit le patch suivant pour jka-compr.el qui ajoute bzip2 au mode d'auto-compression.
Avertissement: 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.
Pour l'utiliser,
patch < jka-compr.el.diff
M-x byte-compile-file jka-compr.el
--- 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")
Merci � Ulrik Dickow, 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.
;; (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)
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.
:.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
tenthumbs@cybernex.net nous dit:
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 � $HOME/.Xdefaults ou $HOME/.Xresources.
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.
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
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.
#!/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";