COMO FAZER Bzip2 David Fetter, dfetter@best.com <mailto:dfetter@best.com> v1.92, 18 de Agosto de 1998 Este documento explica como usar o novo programa de compactação bzip2. A cópia local em formato sgml é denominada Bzip2-HOWTO.sgml <Bzip2-HOWTO.sgml> e a sua localização oficial está em <http://www.best.com/~dfetter/Bzip2-HOWTO/Bzip2-HOWTO.sgml>. ______________________________________________________________________ Índice geral 1. Introdução 1.1 (BF 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. Obtendo o bzip2 2.1 COMO FAZER Bzip2 em outros idiomas 2.2 Obtendo binários pré-compilados de bzip2 2.3 Obtendo os fontes do bzip2 2.4 Compilando o bzip2 em máquina local 3. Usando o bzip2 4. Usando o bzip2 com o tar 4.1 Mais fácil de configurar: 4.2 Fácil de configurar, mais fácil de usar, sem necessidade de privilégios de superusuário: 4.3 Também fácil de usar, mas necessita de poderes de superusuário. 5. Usando bzip2 6. Usando o bzip2 com o emacs 6.1 Usando o emacs: 6.2 Mudando o emacs de forma personalizada: 7. Usando o bzip2 com o wu-ftpd 8. Usando o bzip2 com o grep 9. Usando o bzip2 com o Netscape sob o X Window. 10. Usando o bzip2 para compactar novamente outros formatos ______________________________________________________________________ 11.. IInnttrroodduuççããoo Bzip2 é um novo algoritmo para compactação de dados. Ele normalmente gera arquivos que são 60 a 70% do tamanho dos seus similares gerados pelo utilitário gzip. Este documento descreve algumas aplicações bem comuns do bzip2. Futuras versões do documento discutirão a vindoura biblioteca bzip2, cujo autor Julian Seward <mailto:Julian_Seward@muraroa.demon.co.uk> a descreve a seguir: Eu estou trabalhando na próxima versão do bzip2, que usará o mesmo formato de arquivo .bz2; a principal adição é uma biblioteca como zlib - para leitura e escrita de dados neste formato a partir dos programas. Versões futuras do documento podem também incluir um resumo da discussão acima e sobre como o bzip2 pode ser usado no kernel do Linux. 11..11.. HHiissttóórriiaa ee RReevviissããoo 11..11..11.. vv11..9922 Seção ``Obtendo os binários do bzip2'' atualizada, incluindo adições do S.u.S.E. 11..11..22.. vv11..9911 Corrigidos erros tipográficos e clarificados alguns detalhes sobre interpretadores de comandos da seção ``sobre o uso de bzip2 com tar''. Agradecimentos a Alessandro Rubini. Atualizada a ferramenta buzzit para não danificar o arquivo original bzip2. Adicionada bgrep, uma ferramenta similar a zgrep. 11..11..33.. vv11..99 Corrigido o problema com gcc 2.7.*. Agradecimentos a Ulrik Dickow por apontá-lo. Adicionada a maneira elegante de trabalhar com tar, segundo Leonard Jean-Marc. Adicionada Linus à a tradução sueca de kerlund. Corrigida a seção wu-ftpd por sugestão de Arnaud Launay. Traduções movidas para seções próprias. 11..11..44.. vv11..88 Colocado buzzit e tar.diff no sgml. Corrigida pontuação e formatação. Agradecimentos a Arnaud Launay pela sua ajuda corrigindo a cópia. :-) Projeto xv ignorado por enquanto, devido à falta de interesse popular. Adicionadas tarefas difíceis para futuras versões do documento. 11..11..55.. vv11..77 Adicionado utilitário buzzit. Corrigido a atualização do gnu tar. 11..11..66.. vv11..66 Adicionado TenThumbs da Netscape. Também mudado o lesspipe.sh por sugestões. 11..11..77.. vv11..55 Adicionada tradução francesa de Arnaud Launay e seu arquivo wu-ftpd. 11..11..88.. vv11..44 Adicionada tradução japonesa de Tetsu Isaji. 11..11..99.. vv11..33 Adicionado .emacs de Ulrik Dickow. 11..11..1100.. vv11..22 Alterada a atualização para emacs, onde ele então passa a reconhecer os arquivos.bz2 automaticamente. 11..11..1111.. vv11..11 Adicionada alteração para emacs. 11..11..1122.. vv11..00 1º Round. 22.. OObbtteennddoo oo bbzziipp22 A página do Bzip2 está localizada em The UK home site <http://www.muraroa.demon.co.uk/>, o site espelho nos Estados Unidos está em <http://www.digistar.com/bzip2/index.html> e o programa também pode ser encontrado no site ftp da Red Hat <ftp://ftp.redhat.com/pub/contrib>. 22..11.. CCOOMMOO FFAAZZEERR BBzziipp22 eemm oouuttrrooss iiddiioommaass Pessoas que falam francês podem se referir aos documentos franceses de Arnaud Launay. A versão web está localizada em <http://www.freenix.fr/linux/HOWTO/mini/Bzip2.html> e pode ser usado o ftp <ftp://ftp.lip6.fr/pub/linux/french/docs/HOWTO/mini/Bzip2.gz>. Arnaud pode ser contatado pelo correio eletrônico em: zoro@mygale.org <mailto:zoro@mygale.org>. Pessoas que falem japonês podem utilizar os documentos japoneses de Tetsu Isaji <http://jf.gee.kyoto-u.ac.jp/JF/JF.html>. Isaji pode ser encontrado em <http://www2s.biglobe.ne.jp/~kaien/>, ou pelo correio eletrônico isaji@mxu.meshnet.or.jp <mailto:isaji@mxu.meshnet.or.jp>. Pessoas que falem sueco podem querer se referir aos documentos suecos de Linus à de kerlund <http://user.tninet.se/~uxm165t/linux_doc.html>. Linus pode ser encontrado pelo correio eletrônico uxm165t@tninet.se <mailto:uxm165t@tninet.se>. 22..22.. OObbtteennddoo bbiinnáárriiooss pprréé--ccoommppiillaaddooss ddee bbzziipp22 Os binários podem ser obtidos nos seguintes sites: Binários Intel do Debian estão em <ftp://ftp.debian.org/debian/dists/stable/main/binary- i386/utils/bzip2_0.1pl2-5.deb>. Binários Alfa da Red Hat estão em <ftp://ftp.redhat.com/pub/redhat/redhat-5.1/alpha/RedHat/RPMS/bzip2-0.1pl2-1.alpha.rpm>. Binários Intel da Red Hat estão em <ftp://ftp.redhat.com/pub/redhat/redhat-5.1/i386/RedHat/RPMS/bzip2-0.1pl2-1.i386.rpm>. Binários SPARC da Red Hat estão em <ftp://ftp.redhat.com/pub/redhat/redhat-5.1/sparc/RedHat/RPMS/bzip2-0.1pl2-1.sparc.rpm>. Binários Intel da Slackware estão em <ftp://www.cdrom.com/pub/linux/slackware-3.5/slackware/a1/bzip2.tgz>. Binários Intel da S.u.S.E. estão em <ftp://ftp.suse.com/pub/SuSE- Linux/5.2/suse/ap1/bzip.rpm>. Eles podem ser obtidos ainda em caminhos análogos nos diversos sites espelho. 22..33.. OObbtteennddoo ooss ffoonntteess ddoo bbzziipp22 Eles são provenientes de sites Oficiais (veja ``Obtendo Bzip2'') ou do site do Red Hat em <ftp://ftp.redhat.com/pub/contrib/SRPMS/bzip2-0.1pl2-1.src.rpm>. 22..44.. CCoommppiillaannddoo oo bbzziipp22 eemm mmááqquuiinnaa llooccaall DDeevvee--ssee tteerr oo ggcccc 22..77..** e se alterar a linha que descreve CFLAGS = -O3 -fomit-frame-pointer -funroll-loops para CFLAGS = -O2 -fomit-frame-pointer ou seja, deve ser substituído -O3 por -O2 e retirar o parâmetro -funroll-loops. Pode-se ainda adicionar quaisquer parâmetros -m* (como -m486, por exemplo) quando se estiver compilando o kernel. Evitar o parâmetro -funroll-loops é a parte mais importante, uma vez que isto pode fazer com que muitos compiladores gcc gerem códigos errados com códigos lentos e grandes. Para outros compiladores (lcc, egcs, gcc 2.8.x) o padrão CFLAGS é suficiente. Após isto, basta executar make -o e instalar o programa conforme o descrito no arquivo README. 33.. UUssaannddoo oo bbzziipp22 O uso do bzip2 deve ser iniciado por uma atenta leitura da página de manual. :) 44.. UUssaannddoo oo bbzziipp22 ccoomm oo ttaarr A seguir apresentamos três maneiras de usar o bzip2 com o tar. 44..11.. MMaaiiss ffáácciill ddee ccoonnffiigguurraarr:: Este método não requer configuração. Para descompactar um arquivo gerado pelo bzip2 e o tar, chamado foo.tar.bz2, presente no diretório atual, deve-se executar o comando: /path/to/bzip2 -cd foo.tar.bz2 | tar xf - Isto funciona, mas pode ser intediante digitá-lo freqüentemente. Pode- se usar então os esquemas descritos a seguir. 44..22.. FFáácciill ddee ccoonnffiigguurraarr,, mmaaiiss ffáácciill ddee uussaarr,, sseemm nneecceessssiiddaaddee ddee pprriivviillééggiiooss ddee ssuuppeerruussuuáárriioo:: Agradecimentos a Leonard Jean-Marc <mailto:leonard@sct1.is.belgacom.be> pela dica. Agradecimentos também para Alessandro Rubini <mailto:rubini@morgana.systemy.it> pelas dicas de diferenciação entre o bash e outros interpretadores de comando csh. No .bashrc, deve-se adicionar a seguinte linha: alias btar='tar --use-compress-program /usr/local/bin/bzip2 ' No .tcshrc ou .cshrc, a linha análoga tem o seguinte formato: alias btar 'tar --use-compress-program /usr/local/bin/bzip2' 44..33.. TTaammbbéémm ffáácciill ddee uussaarr,, mmaass nneecceessssiittaa ddee ppooddeerreess ddee ssuuppeerruussuuáárriioo.. Deve-se aplicar a atualização a seguir no gnu tar 1.12: cd tar-1.12/src; patch < /path/to/tar.diff A seguir ele deve ser compilado e instalado. Certifique-se que tanto o tar como bzip2 estão no $PATH através dos comandos "which tar" e "which bzip2." Para usar-se o novo comando tar, basta executar o seguinte: tar xyf foo.tar.bz2 para descompactar o arquivo. Para criar um novo arquivo compactado deve-se executar: tar cyf foo.tar.bz2 arquivo1 arquivo2 arquivo3...diretório1 diretório2... Aqui está a atualização: *** 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, _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.. UUssaannddoo bbzziipp22 Para descompactar arquivos gerados pelo bzip2 durante a execução, por exemplo com o uso do comando "less" ou com o bunzip2, pode-se executar o lesspipe.sh (man less) da seguinte forma: #!/bin/sh # Este é um pré-processador de 'less'. Ele é usado através da variável # de ambiente: LESSOPEN="|lesspipe.sh %s" case "$1" in *.tar) tar tvvf $1 2>/dev/null ;; # Verifica o conteúdo dos arquivos tar *.tgz) tar tzvvf $1 2>/dev/null ;; # isso funciona para versões não modificadas do tar: *.tar.bz2) bzip2 -cd $1 $1 2>/dev/null | tar tzvvf - ;; # este funciona com versões atualizadas do tar: # *.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 ;; # verifica os arquivos comprimidos *.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 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` ; # verifica se o arquivo é um binário # 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.. UUssaannddoo oo bbzziipp22 ccoomm oo eemmaaccss 66..11.. UUssaannddoo oo eemmaaccss:: Havia sido escrita a seguinte atualização para jka-compr.el que adiciona o bzip2 no modo de compactação automática. Isso só foi testado com emacs-20.2, porém tenho razões para acreditar que um funcionamento similar ocorrerá com outras versões. Para usá-lo neste formato deve-se seguir os seguintes passos: 1. Ir para o diretório de fontes emacs-20.2/lisp (ou onde quer que ele tenha sido descompactado com tar); 2. Colocar a atualização abaixo em um arquivo chamado jka- compr.el.diff (o arquivo não deve ter outro conteúdo); 3. Executar patch < jka-compr.el.diff 4. Iniciar o emacs, e executar M-x byte-compile-file jka-compr.el 5. Fechar o emacs; 6. Mover o arquivo jka-compr.elc original para um lugar seguro e 7. Substituir o arquivo pelo novo jka-compr.elc. 8. Divirta-se! --- 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 @@ ;; A variável jka-compr-compression-info-list pode ser usada para ;; adaptar jka-compr para trabalhar com outros programas compactados. ;; O valor padrão desta variável permite que jka-compr trabalhe com -;; Unix compactado e gzip. David Fetter adicionou suporte bzip2 :) ;; ;; Se você está preocupado com a saída stderr de gzip e outros programas de ;; compactação/descompactação mostrados nos buffers (área de memória) @@ -121,7 +121,9 @@ ;;; Eu tenho isto definido então aqueles arquivos .Z são presumidos para unix -;;; formato compactado; e arquivos .gz, no formato gzip. +;;; formato compactado; e arquivos .gz, em formato gzip, e arquivos .bz2, +;;; no novo formato bzip2 do http://www.muraroa.demon.co.uk. +;;; Continue o bom trabalho, gente! (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.. MMuuddaannddoo oo eemmaaccss ddee ffoorrmmaa ppeerrssoonnaalliizzaaddaa:: Agradecimentos para Ulrik Dickow, ukd@kampsax.dk <mailto:ukdATkampsax.dk>, Programador de sistemas na Kampsax Technology. Para poder usar o bzip2 automaticamente quando você não é o administrador do sistema (sysadmin), basta adicionar o seguinte no arquivo .emacs:. ;; (Des)compactação automática nos arquivos carregar/guardar (gzip(1)) ;; Nós iniciamos ele no estado desligado, então este suporta bzip2(1) ;; Códigos lançados juntos pelo Ulrik Dickow para ~/.emacs com Emacs 19.34. ;; Devem funcionar com antigos e novos Emacs também. Embora sem garantia. ;; (if (fboundp 'auto-compression-mode) ; Emacs 19.30+ (auto-compression-mode 0) (require 'jka-compr) (toggle-auto-compression 0)) ;; Adicione agora suporte bzip2 e volte auto compactação. (add-to-list 'jka-compr-compression-info-list ["\\.bz2\\(~\\|\\.~[0-9]+~\\)?\\'" "zipping" "bzip2" () "unzipping" "bzip2" ("-d") nil t]) (toggle-auto-compression 1 t) 77.. UUssaannddoo oo bbzziipp22 ccoomm oo wwuu--ffttppdd Agradecimentos a Arnaud Launay por este economizador de banda. O que se segue deve estar em /etc/ftpconversions para a realização de compactações automáticas. Assegure-se que os caminhos (como /bin/compress) estão corretos. :.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.. UUssaannddoo oo bbzziipp22 ccoomm oo ggrreepp O utilitário seguinte, que eu chamo de bgrep, é uma modificação leve do zgrep que vem com o Linux. Pode ser usado para pesquisas através de arquivos não compactados pelo bunzip2. #!/bin/sh # bgrep - um invólucro do programa grep que descompacta arquivos se necessário 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 tem problemas com -e em 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 "pesquisa através de arquivos compactados pelo bzip2" echo "uso: $prog [opções do grep] padrão [arquivos]" 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.. UUssaannddoo oo bbzziipp22 ccoomm oo NNeettssccaappee ssoobb oo XX WWiinnddooww.. tenthumbs@cybernex.net diz: Eu encontrei uma maneira de conseguir com que o Netscape do Linux use o bzip2 em Content-Encoding do mesmo modo que ele usa gzip. Deve ser adicionada no $HOME/.Xdefaults ou no $HOME/.Xresources o conteúdo a seguir. Eu uso a opção -s por preferir trocar velocidades de descompactação por uso de RAM. Esta opção não necessita ser utilizada. 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.. UUssaannddoo oo bbzziipp22 ppaarraa ccoommppaaccttaarr nnoovvaammeennttee oouuttrrooss ffoorrmmaattooss O seguinte programa em perl recebe arquivos compactados em outros formatos (.tar.gz, .tgz. .tar.Z e .Z) e os empacota para uma melhor compactação. O fonte em Perl está documentado. #!/usr/bin/perl -w ######################################################## # # # Este programa recebe programas compactados e gzipados# # no diretório atual e transforma-os no formato bzip2. # # Ele maneja a extensão .tgz de uma forma razoável, # # produzindo um arquivo .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 "Reempacotando $_ ($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 é $factor% do tamanho de $_. :",($factor<100)?')':'(',"\n"; unlink $_; } else { print "Algo aconteceu com $_: $!\n"; } } print "Foram economizados ", ($saved_bytes>=0)?"economizados":"perdidos", " $saved_bytes bytes de espaço de armazenamento :", ($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 "Não foi possível abrir o arquivo: $!"; $machine_bzip2_total += $saved_bytes; print TOTAL $machine_bzip2_total; close TOTAL; print "Total de ",`cat $totals_file`," bytes economizados.\n";