# Bzip2 Howto

## David Fetter dfetter@best.com
v1.92 18 sierpnia 1998
Wersja polska: Krzysztof P. Jasiutowicz kpjas@priv.onet.pl
v0.99, 28 sierpnia 1998

Ten tekst wyjaśnia jak używać programu do kompresji bzip2. Lokalna wersja tego tekstu w sgml-u jest dostępna tu tu, a "autor-ytatywna" pod tym adresem tu. Dokument ten został napisany w standardzie ISO-8859-2.

## 1. Wstęp

Bzip2 to superowy nowy algorytm kompresji danych. Ogólnie rzecz biorąc tworzy pliki, które są 60-70% mniejsze od takich samych plików spakowanych gzip-em.

Ten dokument opisze kilka typowych zastosowań bzip2-a.

Przyszłe wersje tego dokumentu będą dotyczyły planowanej bzip2 library którą autor bzip2-a, Julian Seward opisuje następująco:

    Pracuję nad następną wersją bzip2-a, która będzie używać tego samego
    formatu pliku .bz2; główną nowością będzie biblioteka podobna do zlib
    służąca do odczytywania i zapisu danych w tym formacie z poziomu programu.

Przyszłe wersje tego dokumentu mogą także zawierać podsumowanie dyskusji nad tym czy (i jak) bzip2 powinno być zastosowane w jądrze Linux-a.

## 1.1 Revision History

### v1.92

Zaktualizowałem rozdział Pobieranie binariów bzip2, dodałem S.u.S.E.

### v1.91

Poprawiłem błąd w pisowni i poprawiłem kilka idiomów shell-a w rozdziale o używaniu bzip2-a z tar-em. Podziękowania dla Alessandro Rubini za nie.

Poprawiłem aby narzędzie buzzit nie [to stomp] oryginalnego archiwum bzip2-a.

Dodałem bgrep, narzędzie podobne do zgrep-a.

### v1.9

Poprawiłem problem z gcc 2.7.*. Podziękowanie dla Ulrika Dickow-a za wskazanie go.

Dodałem elegancki sposób Leonard-a Jean-Marc-a posługiwania się tar-em.

Dodałem szwedzkie tłumaczenie Linus-a Ăkerlund-a.

Poprawiłem rozdział o wu-ftpd np. sugestii Arnaud Launay-a.

Przeniosłem tłumaczenia ich odpowiednich rozdziałów.

### v1.8

Wstawiłem buzzit i tar.diff do sgml-a tam gdzie ich miejsceg. Poprawiłem interpunkcję i formatowanie. Podziękowania dla Arnaud Launay za jego pomoc w poprawianiu mojej własnej wersji. :-)

Porzuciłem xv project na razie z powodu braku większego zainteresowania.

Wspomniałem o tipsach w przyszłych wersjach tego dokumentu.

### v1.7

Dodałem aplikację buzzit. Poprawiłem patch do nałożenia na gnu tar.

### v1.6

Dodałem tip TenThumbs-a dot. Netscape.

Także zmieniłem lesspipe.sh dzięki jego sugestii. Powinien teraz lepiej działać.

### v1.5

Dodałem francuskie tłumaczenie Arnaud Launay-a, i jego plik wu-ftpd.

### v1.4

Dodałem japońskie tłumaczenie Tetsu Isaji-ego.

### v1.3

Dodałem plik Ulrik Dickow-a .emacs do emacs-a 19.30 lub wyższej wersji.

(także poprawiłem patch jka-compr.el do emacs-a dzięki jego sugestii. Ojej! Bzip2 nie ma jeszcze(?) flagi "append".)

### v1.2

Zmienilem patch do emacs-a aby automagicznie rozpoznawał pliki .bz2.

### v1.1

Dodałem patch dla emacs-a.

### v1.0

Runda 1.

## 2. Jak zdobyć bzip2

Home page Bzip2-a znajduje się na Home site w Wielkiej Brytanii. Mirror site w U.S.A jest tu. Można też znaleźć go na site-cie FTP Red Hat-a tu.

## 2.1 Bzip2-HOWTO w twoim języku

Osoby posługujące się językiem francuskim mogą skierować się do francuskich dokumentów Arnaud Launay-a. Wersja WWW jest tu, a ftp można użyć tu Z Arnaud można skontaktować się pocztą elektroniczną pod tym adresem

Osoby posługujące się językiem japońskim mogą skierować się do japońskich dokumentów Tetsu Isaji tu. Z Isaji można skotaktować się na jego stronie WWW, lub pocztą elektroniczną pod tym adresem.

Osoby posługujące się językiem szwedzkim mogą skierować się do szwedzkich Linus-a Ăkerlund-a tu. Z Linus-em można się skontaktować pocztą elektroniczną pod tym adresem.

## 2.2 Jak zdobyć prekompilowane binaria bzip2-a

Zobacz Home site-y.

Binarium Debian Intel jest tu.

Binarium alpha Red Hat-a jest tu.

Binarium Intel Red Hat-a jest tu.

Binarium SPARC Red Hat-a jest tu.

Binarium Intel Slackware jest tu.

Binarium Intel S.u.S.E jest tu.

Wyżej wymienione są także dostępne w analogicznuch miejscach różnych lustrzanych site-ów.

## 2.3 Jak zdobyć źródła bzip2-a

Znajdują się na oficjalnych site-ach (zobacz w Jak zdobyć Bzip2 gdzie, albo Red Hat ma je tu).

## 2.4 Kompilacja bzip2-a dla twojej maszyny

Jeśli masz gcc 2.7.*, zmień linijkę która brzmi

> `

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

> `

na

> `

>     CFLAGS = -O2 -fomit-frame-pointer

> `

to jest, zamień -O3 na -O2 i pomiń -funroll-loops. You may also wish to add any -m* flags (like -m486, for example) you use when compiling kernels.

Usunięcie -funroll-loops jest najistotniejszą częścią, ponieważ może to spowodować wiele gcc 2.7-ów będzie generowało nieprawidłowy kod, a wszystkie gcc 2.7-y będą większy i wolniejszy kod wynikowy. Dla innych kompilatorów (lcc, egcs, gcc 2.8.x) standartowe CFLAGS są w porządku.

Potem, po prostu `make` i zainstaluj wg README.

## 3. Używanie bzip2

Przeczytaj Wspanaiałą Stronę Podręcznika Systemowego :)

## 4. Używanie bzip2 z tar-em

Poniżej są opisane trzy metody używania bzip2 z tar-em, a mianowicie

## 4.1 Najłatwiejsza do zrobienia:

Ta metoda nie wyamga wcale żadnych zmian. Aby od-tar-ować bzip2-owane archiwum tar-owe, foo.tar.bz2 w aktualnym katalogu, wykonaj

> `

>     /path/to/bzip2 -cd foo.tar.bz2 | tar xf -

> `

To działa, ale może być wnerwiające jeśli wypisuje się to zbyt często.

## 4.2 Łatwa do zrobienia, dość łatwa w użyciu, nie trzba mieć uprawnień root-a:

Dzięki dla Leonard Jean-Marc za ten tip. Dzięki także dla Alessandro Rubini za wprawadzenie różnic specyficznych dla csh.

W swoim .bashrc, możesz wstawić taką linijkę :

> `

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

> `

W .tcshrc, lub .cshrc, analogiczna linijka wygląda tak:

> `

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

> `

## 4.3 Też łatwa do zrobienia, ale wymaga dostępu jako root.

Nałóż poniższy patch na gnu tar 1.12 w następujący sposób:

> `

>     cd tar-1.12/src; patch < /path/to/tar.diff

> `

skompiluj go, i zainstaluj go, i wszystko już gotowe do działania. Upewnij się ze zarówno tar jak i bzip2 są w twojej $PATH poprzez "which tar" i "which bzip2." Aby użyć nowego tar-a, po prostu zrób

> `

>      tar xyf foo.tar.bz2

> `

aby zdekompresować plik.

Aby utworzyć nowe archiwum, podobnie zrób:

> `

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

> `

A oto patch:

    *** 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. Używanie bzip2 z less-em

Aby dekompresować pliki bzip2 w locie, tj. aby móc używać less-a do czytania ich bez wcześniejszego bunzip2-owania ich, należy zrobić lesspipe.sh (man less) w ten sposób:

    #!/bin/sh
    # To jest preprocessor dla 'less-a'.  Jest on używany, gdy ta zmienna
    # środowiskowa jest ustawiona:   LESSOPEN="|lesspipe.sh %s"

      case "$1" in
      *.tar) tar tvvf $1 2>/dev/null ;; # Oglądaj zawartość różnych plików tar-owych
      *.tgz) tar tzvvf $1 2>/dev/null ;;
    # Działa dla niezmodyfikowanej wersji tar-a
      *.tar.bz2) bzip2 -cd $1 $1 2>/dev/null | tar tzvvf - ;;
    # Działa z spatchowaną wersją tar-a
    # *.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 ;; # Oglądaj spakowane pliki
      *.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. Używanie bzip2 z emacs-em

## 6.1 Zmaina emacs-a dla wszystkich:

Napisalem ten patch do jka-compr.el który dodaje bzip2 do auto-compression-mode.

Disclaimer: Spawdziłem go tylko z emacs-20.2, ale nie mam powodów by sądzić, że podobne postępowanie nie będzie działać z innymi wersjami.

By go użyć,

1. Przejdź do katalogu źródłowego emacs-20.2/lisp (tam gdzie go roztarowałeś)
2. Wstaw ten patch do pliku jka-compr.el.diff ( powinien być sam w tym pliku ;).
3. Wykonaj

   > `

   >      patch < jka-compr.el.diff

   > `

4. Wystartuj emacs-a, i wykonaj

   > `

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

   > `

5. Wyjdź z emacs-a.
6. Przenieś pierwotny jka-compr.elc w bezpieczne miejsce gdyby były bug-i.
7. Zastąp go new jka-compr.elc.
8. Baw się dobrze!

    --- 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 dodał 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 Zmiana emacs-a dla pojedyńczego użytkownika:

Podziękowania za to mależą się Ulrik-owi Dickow-owi, ukd@kampsax.dk, programiście systemowemu w Kampsax Technology:

Aby móc używać bzip2 automatycznie gdy nie jesteś sysadmin-em, po prostu dodaj co następuje do swojego pliku .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. Używanie bzip2-a z wu-ftpd

Podziękowania dla Arnaud Launay za tego oszczędzacza bandwidth-u. To co następuje powinno się znaleźć w /etc/ftpconversions aby wykonywać kompresję i dekompresję on-the-fly za pomocą bzip2. Upewnij się, że ścieżki takie jak (like /bin/compress) są poprawne.

     :.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. Użycie bzip2 z grep-em

Ten użytek, który nazwałem bgrep, jest niewielką modyfikacją zgrep który jest dostarczany z Linux-em. Można go używać do grep-owania plików bez bunzip2-owania ich najpierw.

    #!/bin/sh

    # bgrep -- a wrapper around a grep program that decompresses files as needed
    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 is buggy with -e on 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 through bzip2 files"
      echo "usage: $prog [grep_options] pattern [files]"
      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

## 9. Używanie bzip2-a z Netscape-m pod X-ami.

tenthumbs@cybernex.net pisze:

> `Znalazłem sposób aby spowodować żeby Linux-owy Netscape używał bzip2-a do Content-Encoding tak jak używa gzip-a. Dodaj to do $HOME/.Xdefaults lub $HOME/.Xresources

> Używam opcji -s ponieważ wolę stracić trochę z szybkości dekompresji na korzyść zużycia RAM-u. Możn pominąć tą opcję, jeśli ktoś tak chce.

> `

    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

## 10. Użycie bzip2-a do rekompresji plików skompresowanych w innych formatach

Ten program w perl-u pobiera plik skompresowany w innych formatach (.tar.gz, .tgz. .tar.Z, and .Z ) i przepakowuje je dla lepszej kompresji. Kod żródłowy w perl-u ma wiele porządnej dokumentacji dotyczącej tego co robi i jak to robi co robi.

    #!/usr/bin/perl -w

    #######################################################
    #                                                     #
    # Ten program pobiera pliki skompresowane programami  #
    # compress i gzip w aktualnym katalogu i zamienia je  #
    # do formatu bzip2. Obsługuje rozdszerzenie .tgz w    #
    # prawidłowy sposób, tworząc plik .tar.bz2.           #
    #                                                     #
    #######################################################
    $counter = 0;
    $saved_bytes = 0;
    $totals_file = '/tmp/machine_bzip2_total';
    $machine_bzip2_total = 0;

    while(<*[Zz]>) {
        next if /^bzip2-0.1pl2.tar.gz$/;
        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 "Repacking $_ ($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!  Something happened to $_: $!\n";
        }
    }
    print "You've ",
          ($saved_bytes>=0)?"saved":"lost",
          " $saved_bytes bytes of storage space :",
           ($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 "Can't open system-wide total: $!";
    $machine_bzip2_total += $saved_bytes;
    print TOTAL $machine_bzip2_total;
    close TOTAL;

    print "That's a machine-wide total of ",`cat $totals_file`," bytes saved.\n";