Bzip2 mini-KAKO

David Fetter, dfetter@best.com

verzija 1.92, 18. kolovoza 1998.


Ovaj dokument govori o korištenju bzip2, novog programa za sažimanje. Autorativni SGML nalazi se na http://www.best.com/~dfetter/Bzip2-HOWTO/Bzip2-HOWTO.sgml.

1. Uvod

Bzip2 je zgodan novi algoritam za sažimanje podataka. Općenito, datoteke čini 30-40% manjim od veličine njihovih gzip-anih pandana.

Ovaj dokument vodi vas kroz nekoliko uobičajenih primjena bzip2-a.

Buduće verzije dokumenta govorit će o dolazećem bzip2 libraryu kojeg autor bzip2, Julian Seward, Julian_Seward@muraroa.demon.co.uk, opisuje ovako:

Radim na slijedećoj verziji bzip2, koja će koristiti isti .bz2 format datoteka; glavna novost je zlib-oliki library za čitanje i pisanje podataka u tom formatu iz drugih programa.

Buduće verzije dokumenta možda će također sadržavati sažetak rasprava o tome da li bi (i kako) trebalo koristiti bzip2 u Linux kernelu.

1.1 Popis promjena

verzija 1.92

Osvježio dio Nabavljanje već kompajliranih izvršnih datoteka bzip2 i dodao S.u.S.E.-ove.

verzija 1.91

Ispravio pravopisnu grešku i razjasnio neke idiome ljuske u dijelu Korištenje bzip2 uz tar. Za to hvala Alessandru Rubiniju.

Sredio buzzit alat tako da se ne zagrcne na postojećoj bzip2 arhivi.

Dodao bgrep, zgrep-olik alat.

verzija 1.9

Razjasnio gcc 2.7.* problem. Hvala Ulriku Dickowu što me upozorio.

Dodao elegantni način rada s tarom Leonarda Jean-Marca.

Dodao švedski prijevod Linusa Ăkerlunda.

Sredio wu-ftpd dio po prijedlogu Arnauda Launaya.

Prijevode premjestio u poseban dio.

verzija 1.8

buzzit i tar.diff u SGML-u stavio tamo gdje spadaju. Sredio interpunkcije i izgled. Hvala Arnaudu Launayu na pomoći u ispravljanju mog primjerka. :-)

Za sada ispustio xv projekt zbog nedostatnog zanimanja javnosti.

Dodao teasers za buduće verzije dokumenta.

verzija 1.7

Dodao alat buzzit. Sredio zakrpu za GNU tar.

verzija 1.6

Dodao TenThumbsov program za Netscape.

Promijenio i lesspipe.sh prema njegovom prijedlogu. Sad bi trebao raditi bolje.

verzija 1.5

Dodao francuski prijevod Arnauda Launaya i njegovu datoteku za wu-ftpd.

verzija 1.4

Dodao japanski prijevod Tetsua Isajia.

verzija 1.3

Dodao .emacs Ulrika Dickowa za 19.30 i bolji.

(Ispravio i jka-compr.el prema njegovu prijedlogu. Ups! Bzip2 još(?) nema "append" prekidač.)

verzija 1.2

Promijenio zakrpu za emacs tako da automatski prepoznaje .bz2 datoteke.

verzija 1.1

Dodao zakrpu za emacs.

verzija 1.0

Prva runda.

2. Nabavljanje bzip2

WWW stranica bzip2 nalazi se na http://www.muraroa.demon.co.uk/. Mirror u SAD je http://www.digistar.com/bzip2/index.html. Možete ga naći i na Red Hatovom FTP serveru: ftp://ftp.redhat.com/pub/contrib/.

2.1 Bzip2-HOWTO na vašem jeziku

Francuski čitatelji mogu pročitati francuski prijevod Arnauda Launaya. WWW verzija je na http://www.freenix.fr/linux/HOWTO/mini/Bzip2.html, a FTP-om ga možete dobiti s ftp://ftp.lip6.fr/pub/linux/french/docs/HOWTO/mini/Bzip2.gz. Arnauda možete kontaktirati elektronskom poštom na zoro@mygale.org.

Japanski čitatelji mogu pročitati japanski prijevod Tetsua Isajia na http://jf.gee.kyoto-u.ac.jp/JF/JF.html. Do Isajia možete doći preko njegove WWW stranice, http://www2s.biglobe.ne.jp/~kaien/.

Švedski čitatelji mogu pročitati švedski prijevod Linusa Ăkerlunda na http://user.tninet.se/~uxm165t/linux_doc.html. Linusova e-mail adresa je uxm165t@tninet.se.

2.2 Nabavljanje već kompajliranih izvršnih datoteka bzip2

Pogledajte WWW stranice bzip2.

Debianova izvršna datoteka za Intel nalazi se na ftp://ftp.debian.org/debian/dists/stable/main/binary-i386/utils/bzip2_0.1pl2-5.deb.

Red Hatova izvršna datoteka za Alphu nalazi se na ftp://ftp.redhat.com/pub/redhat/redhat-5.1/alpha/RedHat/RPMS/bzip2-0.1pl2-1.alpha.rpm.

Red Hatova izvršna datoteka za Intel nalazi se na ftp://ftp.redhat.com/pub/redhat/redhat-5.1/i386/RedHat/RPMS/bzip2-0.1pl2-1.i386.rpm.

Red Hatova izvršna datoteka za SPARC nalazi se na ftp://ftp.redhat.com/pub/redhat/redhat-5.1/sparc/RedHat/RPMS/bzip2-0.1pl2-1.sparc.rpm.

Slackwareova izvršna datoteka za Intel nalazi se na http://www.cdrom.com/pub/linux/slackware-3.5/slakware/a1/bzip2.tgz.

S.u.S.E.-ova izvršna datoteka za Intel nalazi se na ftp://ftp.suse.com/pub/SuSE-Linux/5.2/suse/ap1/bzip.rpm.

Na istim mjestima možete ih naći na raznim mirrorima.

2.3 Nabavljanje izvornog koda bzip2

Može se naći na službenim stranicama (pogledajte Nabavljanje bzip2), a Red Hat ga drži na ftp://ftp.redhat.com/pub/contrib/SRPMS/bzip2-0.1pl2-1.src.rpm.

3. Kompajliranje bzip2 za vaš stroj

Ako imate gcc 2.7.*, promijenite red

CFLAGS = -O3 -fomit-frame-pointer -funroll-loops
u
CFLAGS = -O2 -fomit-frame-pointer
To jest, -O3 zamijenite s -O2 i izostavite -funroll-loops. Također možete dodati -m* prekidače (-m486, na primjer) koje koristite kod kompajliranja kernela.

Najvažnije je izbjeći -funroll-loops jer će zbog toga mnogi gcc-i verzije 2.7 generirati pogrešan kod, a svi gcc-i 2.7 generirati sporiji i veći kod. Za druge kompajlere (lcc, egcs, gcc 2.8.x) CFLAGS ne treba mijenjati.

Nakon toga samo make i instalirajte ga prema README-u.

4. Korištenje samog bzip2

RTFM (pročitajte tu dobru man stranicu :).

5. Korištenje bzip2 uz tar

Evo tri načina korištenja bzip2 uz tar, to jest:

5.1 Najlakši za namještanje

Ova metoda ne zahtijeva nikakvo petljanje. Za dearhiviranje bzip2-ane tar arhive, foo.tar.bz2, u trenutnom direktoriju, napišite

/staza/do/bzip2 -cd foo.tar.bz2 | tar xf -
To radi, ali toliko tipkati često može biti mučno.

5.2 Lagan za namještanje, relativno lagan za korištenje, bez potrebe za root privilegijama

Hvala Leonardu Jean-Marcu, leonard@sct1.is.belgacom.be, što mi je ovo spomenuo. Također hvala Alessandru Rubiniju, rubini@morgana.systemy.it, za razlike između basha i csha.

U svoj .bashrc možete staviti ovakav red:

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

U .tcshrc ili .cshrc odgovarajući red izgleda ovako:

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

5.3 Isto tako lak za korištenje, ali zahtijeva root pristup

Slijedeću zakrpu ovako primjenite na GNU tar 1.12:

cd tar-1.12/src; patch < /staza/do/tar.diff
Zatim ga kompajlirajte, instalirajte i to je to. Provjerite da li su i tar i bzip2 u $PATH pomoću which tar i which bzip2. Dearhivirati datoteke sada možete jednostavnim
tar xyf foo.tar.bz2

Stvaranje nove arhive je slično:

tar cyf foo.tar.bz2 datoteka1 datoteka2... direktorij1 direktorij2...

Evo zakrpe:

*** 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':

6. Korištenje bzip2 uz less

Za dekompresiju bzip2-anih datoteka u letu, odnosno mogućnost korištenja lessa bez bunzip2-avanja, možete napraviti lesspipe.sh (pogledajte man less) poput ovog:

#!/bin/sh
# Ovo je preprocesor za less. Koristi se kada je postavljena varijabla
# okružja:  LESSOPEN="|lesspipe.sh %s"

  case "$1" in
  *.tar) tar tvvf $1 2>/dev/null ;; # Prikaz sadržaja raznih tar datoteka
  *.tgz) tar tzvvf $1 2>/dev/null ;;
# Ovo će raditi za nepromijenjenu verziju tara:
  *.tar.bz2) bzip2 -cd $1 $1 2>/dev/null | tar tzvvf - ;;
# Ovo radi za zakrpanu verziju tara:
# *.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 ;; # Ispravan pregled sažetih datoteka
  *.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) DATOTEKA=`file -L $1` ; # u groffu
    DATOTEKA=`echo $DATOTEKA | cut -d ' ' -f 2`
    if [ "$DATOTEKA" = "troff" ]; then
      groff -s -p -t -e -Tascii -mandoc $1
    fi ;;
  *) cat $1 2>/dev/null ;;
#  *) DATOTEKA=`file -L $1` ; # Provjeravamo da li je binarna -- pregled preko strings
#    DATOTEKA1=`echo $DATOTEKA | cut -d ' ' -f 2`
#    DATOTEKA2=`echo $DATOTEKA | cut -d ' ' -f 3`
#    if [ "$DATOTEKA1" = "Linux/i386" -o "$DATOTEKA2" = "Linux/i386" \
#         -o "$DATOTEKA1" = "ELF" -o "$DATOTEKA2" = "ELF" ]; then
#      strings $1
#    fi ;;
  esac

7. Korištenje bzip2 uz emacs

7.1 Mijenjanje emacsa za sve

Napisao sam slijedeću zakrpu jka-compr.el-u. Ona bzip2 dodaje auto-compression-modeu.

Napomena: Ovo sam testirao samo na emacsu 20.2, ali ne vidim razloga zašto sličan pristup ne bi radio s drugim verzijama.

Primjenite ju ovako:

  1. Otiđite u direktorij emacs-20.2/lisp s izvornim kodom (gdje god ste ga otpakirali).
  2. Snimite ovu zakrpu u datoteku jka-compr.el.diff (u toj bi datoteci trebala biti samo ona ;).
  3. Napišite
    patch < jka-compr.el.diff
    
  4. Pokrenite emacs i napišite
     M-x byte-compile-file jka-compr.el
    
  5. Izađite iz emacsa.
  6. Svoj izvorni jka-compr.elc maknite na sigurnije mjesto za slučaj greške.
  7. Uživajte!

--- 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")

7.2 Mijenjanje emacsa za jednu osobu

Za ovo hvala Ulriku Dickowu, ukd@kampsax.dk, sistemskom programeru iz Kampsax Technology.

Ako želite automatski koristiti bzip2 kada niste root, samo dodajte ovo svojoj .emacs datoteci.

;; Automatska (de)kompresija kod učitavanja/snimanja datoteka (gzip(1) i
;;   slično)
;; Pokrećemo ju u ugašenom stanju tako da se može dodati podrška za
;; bzip2(1). Kod skupio Ulrik Dickow za ~/.emacs uz Emacs 19.34. Trebalo bi
;; raditi i s mnogim starijim i novijim Emacsima. Ipak, nema jamstva.
;;
(if (fboundp 'auto-compression-mode) ; Emacs 19.30+
    (auto-compression-mode 0)
  (require 'jka-compr)
  (toggle-auto-compression 0))
;; Sad dodajmo bzip2 podršku i ponovo uključimo automatsku kompresiju
(add-to-list 'jka-compr-compression-info-list
             ["\\.bz2\\(~\\|\\.~[0-9]+~\\)?\\'"
              "zipping"        "bzip2"         ()
              "unzipping"      "bzip2"         ("-d")
              nil t])
(toggle-auto-compression 1 t)

8. Korištenje bzip2 uz wu-ftpd

Hvala Arnaudu Launayu za ovo spašavanje bandwidtha. Slijedeće treba staviti u /etc/ftpconversions za de/kompresiju u letu pomoću bzip2. Provjerite da li su staze (/bin/compress na primjer) ispravne.

 :.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

9. Korištenje bzip2 s grepom

Ovaj alat, kojeg sam nazvao bgrep, je malčice promijenjen zgrep koji dolazi s Linuxom. Možete ga koristiti za grep kroz datoteke bez njihovog bunzip2-anja.

#!/bin/sh

# bgrep -- omotač oko programa grep koji po potrebi dekomprimira datoteke
PATH="/usr/bin:$PATH"; export PATH

prog=`echo $0 | sed 's|.*/||'`
case "$prog" in
        *egrep) grep=${EGREP-egrep}     ;;
        *fgrep) grep=${FGREP-fgrep}     ;;
        *)      grep=${GREP-grep}       ;;
esac
pat=""
while test $# -ne 0; do
  case "$1" in
  -e | -f) opt="$opt $1"; shift; pat="$1"
           if test "$grep" = grep; then  # grep pati od grešaka s -e na SVR4
             grep=egrep
           fi;;
  -*)      opt="$opt $1";;
   *)      if test -z "$pat"; then
             pat="$1"
           else
             break;
           fi;;
  esac
  shift
done

if test -z "$pat"; then
  echo "grep kroz bzip2 datoteke"
  echo "usage: $prog [grep_opcije] uzorak [datoteke]"
  exit 1
fi

list=0
silent=0
op=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
case "$op" in
  *l*) list=1
esac
case "$op" in
  *h*) silent=1
esac

if test $# -eq 0; then
  bzip2 -cd | $grep $opt "$pat"
  exit $?
fi

res=0
for i do
  if test $list -eq 1; then
    bzip2 -cdfq "$i" | $grep $opt "$pat" > /dev/null && echo $i
    r=$?
  elif test $# -eq 1 -o $silent -eq 1; then
    bzip2 -cd "$i" | $grep $opt "$pat"
    r=$?
  else
    bzip2 -cd "$i" | $grep $opt "$pat" | sed "s|^|${i}:|"
    r=$?
  fi
  test "$r" -ne 0 && res="$r"
done
exit $res

10. Korištenje bzip2 uz Netscape pod X-om.

tenthumbs@cybernex.net kaže:

Shvatio sam i kako natjerati Netscape za Linux da koristi bzip2 za Content-Encoding baš kao što i koristi gzip. Dodajte ovo $HOME/.Xdefaults ili $HOME/.Xresources:

Koristim opciju -s samo zato što više volim sporiju dekompresiju nego manje RAM-a. Ako želite, možete ju izostaviti.

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

11. Korištenje bzip2 za ponovno sažimanje drugih sažetih datoteka

Ovaj perl program uzima datoteke sažete u drugim formatima (.tar.gz, .tgz, .tar.Z i .Z za ovu iteraciju) i ponovno ih sažima radi bolje kompresije. Izvorni kod ima dosta zgodne dokumentacije o tome što radi i kako to radi.

#!/usr/bin/perl -w

#######################################################
#                                                     #
# Ovaj program uzima compress-ane i gzip-ane datoteke #
# u trenutnom direktoriju i pretvara ih u bzip2       #
# format. S nastavkom .tgz ponaša se razumno,         #
# stvarajući .tar.bz2 datoteku.                       #
#                                                     #
#######################################################
$brojač = 0;
$bajta_snimljeno = 0;
$ukupno_datoteka = '/tmp/bzip2_ukupno_na_stroju';
$bzip2_ukupno_na_stroju = 0;

while(<*[Zz]>) {
    next if /^bzip2-0.1pl2.tar.gz$/;
    push @files, $_;
}
$ukupno = scalar(@files);

foreach (@files) {
    if (/tgz$/) {
        ($novo=$_) =~ s/tgz$/tar.bz2/;
    } else {
        ($novo=$_) =~ s/\.g?z$/.bz2/i;
    }
    $izv_koliko = (stat $_)[7];
    ++$brojač;
    print "Ponovo sažimam $_ ($brojač/$ukupno)...\n";
    if ((system "gzip -cd $_ |bzip2 >$novo") == 0) {
        $novo_koliko = (stat $novo)[7];
        $faktor = int(100*$novo_koliko/$izv_koliko+.5);
        $bajta_snimljeno += $izv_koliko-$novo_koliko;
        print "$novo zauzima oko $faktor% veličine $_. :",($faktor<100)?')':'(',"\n";
        unlink $_;
    } else {
        print "Arrgg! Nešto se dogodilo s $_: $!\n";
    }
}
print ($bajta_snimljeno>=0)?"Dobili":"Izgubili",
      " ste $bajta_snimljeno bajta prostora na disku :",
       ($bajta_snimljeno>=0)?")":"(", "\n";

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


chomp($bzip2_ukupno_na_stroju = `cat $ukupno_datoteka`);
open UKUPNO, ">$ukupno_datoteka"
     or die "Ne mogu otvoriti datoteku s ukupnim rezultatem stroja: $!";
$bzip2_ukupno_na_stroju += $bajta_snimljeno;
print UKUPNO $bzip2_ukupno_na_stroju;
close UKUPNO;

print "Ukupni rezultat cijelog stroja je ",`cat $ukupno_datoteka`," bajta.\n";

12. Hrvatski prijevod

Najnovija verzija ovog prijevoda može se naći na http://dokumentacija.linux.hr/Bzip2.html. Održava ga Matej Vela, mvela@public.srce.hr. Svi su prilozi, primjedbe i prijedlozi dobrodošli.