Bzip2 Howto David Fetter dfetter@best.com v1.92 18 sierpnia 1998 WWeerrssjjaa ppoollsskkaa:: KKrrzzyysszzttooff PP.. JJaassiiuuttoowwiicczz kkppjjaass@@pprriivv..oonneett..ppll 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. ______________________________________________________________________ Table of Contents: 1. Wstęp 1.1. Revision History 1.1.1. v1.92 1.1.2. v1.91 1.1.3. v1.9 1.1.4. v1.8 1.1.5. v1.7 1.1.6. v1.6 1.1.7. v1.5 1.1.8. v1.4 1.1.9. v1.3 1.1.10. v1.2 1.1.11. v1.1 1.1.12. v1.0 2. Jak zdobyć bzip2 2.1. Bzip2-HOWTO w twoim języku 2.2. Jak zdobyć prekompilowane binaria bzip2-a 2.3. Jak zdobyć źródła bzip2-a 2.4. Kompilacja bzip2-a dla twojej maszyny 3. Używanie bzip2 4. Używanie bzip2 z tar-em 4.1. Najłatwiejsza do zrobienia: 4.2. Łatwa do zrobienia, dość łatwa w użyciu, nie trzba mieć uprawnień root-a: 4.3. Też łatwa do zrobienia, ale wymaga dostępu jako root. 5. Używanie bzip2 z less-em 6. Używanie bzip2 z emacs-em 6.1. Zmaina emacs-a dla wszystkich: 6.2. Zmiana emacs-a dla pojedyńczego użytkownika: 7. Używanie bzip2-a z wu-ftpd 8. Użycie bzip2 z grep-em 9. Używanie bzip2-a z Netscape-m pod X-ami. 10. Użycie bzip2-a do rekompresji plików skompresowanych w innych formatach ______________________________________________________________________ 11.. WWssttęępp 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. 11..11.. RReevviissiioonn HHiissttoorryy 11..11..11.. vv11..9922 Zaktualizowałem rozdział ``Pobieranie binariów bzip2'', dodałem S.u.S.E. 11..11..22.. vv11..9911 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. 11..11..33.. vv11..99 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. 11..11..44.. vv11..88 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. 11..11..55.. vv11..77 Dodałem aplikację buzzit. Poprawiłem patch do nałożenia na gnu tar. 11..11..66.. vv11..66 Dodałem tip TenThumbs-a dot. Netscape. Także zmieniłem lesspipe.sh dzięki jego sugestii. Powinien teraz lepiej działać. 11..11..77.. vv11..55 Dodałem francuskie tłumaczenie Arnaud Launay-a, i jego plik wu-ftpd. 11..11..88.. vv11..44 Dodałem japońskie tłumaczenie Tetsu Isaji-ego. 11..11..99.. vv11..33 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".) 11..11..1100.. vv11..22 Zmienilem patch do emacs-a aby automagicznie rozpoznawał pliki .bz2. 11..11..1111.. vv11..11 Dodałem patch dla emacs-a. 11..11..1122.. vv11..00 Runda 1. 22.. JJaakk zzddoobbyyćć bbzziipp22 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 . 22..11.. BBzziipp22--HHOOWWTTOO ww ttwwooiimm jjęęzzyykkuu 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. 22..22.. JJaakk zzddoobbyyćć pprreekkoommppiilloowwaannee bbiinnaarriiaa bbzziipp22--aa 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. 22..33.. JJaakk zzddoobbyyćć źźrróóddłłaa bbzziipp22--aa Znajdują się na oficjalnych site-ach (zobacz w ``Jak zdobyć Bzip2'' gdzie, albo Red Hat ma je tu ). 22..44.. KKoommppiillaaccjjaa bbzziipp22--aa ddllaa ttwwoojjeejj mmaasszzyynnyy JJeeśśllii mmaasszz ggcccc 22..77..**, 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. 33.. UUżżyywwaanniiee bbzziipp22 Przeczytaj Wspanaiałą Stronę Podręcznika Systemowego :) 44.. UUżżyywwaanniiee bbzziipp22 zz ttaarr--eemm Poniżej są opisane trzy metody używania bzip2 z tar-em, a mianowicie 44..11.. NNaajjłłaattwwiieejjsszzaa ddoo zzrroobbiieenniiaa:: 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. 44..22.. ŁŁaattwwaa ddoo zzrroobbiieenniiaa,, ddoośśćć łłaattwwaa ww uużżyycciiuu,, nniiee ttrrzzbbaa mmiieećć uupprraawwnniieeńń rroooott--aa:: 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' 44..33.. TTeeżż łłaattwwaa ddoo zzrroobbiieenniiaa,, aallee wwyymmaaggaa ddoossttęęppuu jjaakkoo rroooott.. 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': 55.. UUżżyywwaanniiee bbzziipp22 zz lleessss--eemm 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 66.. UUżżyywwaanniiee bbzziipp22 zz eemmaaccss--eemm 66..11.. ZZmmaaiinnaa eemmaaccss--aa ddllaa wwsszzyyssttkkiicchh:: Napisalem ten patch do jka-compr.el który dodaje bzip2 do auto- compression-mode. DDiissccllaaiimmeerr:: 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") 66..22.. ZZmmiiaannaa eemmaaccss--aa ddllaa ppoojjeeddyyńńcczzeeggoo uużżyyttkkoowwnniikkaa:: 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) 77.. UUżżyywwaanniiee bbzziipp22--aa zz wwuu--ffttppdd 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 88.. UUżżyycciiee bbzziipp22 zz ggrreepp--eemm 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 99.. UUżżyywwaanniiee bbzziipp22--aa zz NNeettssccaappee--mm ppoodd XX--aammii.. 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 1100.. UUżżyycciiee bbzziipp22--aa ddoo rreekkoommpprreessjjii pplliikkóóww sskkoommpprreessoowwaannyycchh ww iinnnnyycchh ffoorrmmaattaacchh 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";