Bzip2 Howto
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ć,
Przejdź do katalogu źródłowego emacs-20.2/lisp (tam gdzie go roztarowałeś)
Wstaw ten patch do pliku jka-compr.el.diff ( powinien być
sam w tym pliku ;).
Wykonaj
patch < jka-compr.el.diff
Wystartuj emacs-a, i wykonaj
M-x byte-compile-file jka-compr.el
Wyjdź z emacs-a.
Przenieś pierwotny jka-compr.elc w bezpieczne miejsce gdyby były bug-i.
Zastąp go new jka-compr.elc.
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";
Wyszukiwarka
Podobne podstrony:
Bzip2 HOWTO pl 7 (2)Bzip2 HOWTO pl 4 (2)Bzip2 HOWTO pl 6 (2)Bzip2 HOWTO pl 5 (2)Bzip2 HOWTO pl 9 (2)Bzip2 HOWTO pl 1 (2)Bzip2 HOWTO pl (2)Bzip2 HOWTO pl 8 (2)Bzip2 HOWTO plBzip2 HOWTO pl 2 (2)Bzip2 HOWTO pl 10 (2)bootdisk howto pl 8PPP HOWTO pl 6 (2)NIS HOWTO pl 1 (2)cdrom howto pl 1jtz howto pl 5Keystroke HOWTO pl (2)PostgreSQL HOWTO pl 14więcej podobnych podstron