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