(M)  s i s t e m a   o p e r a c i o n a l   m a g n u x   l i n u x ~/ · documentação · suporte · sobre

  Página seguinte Página anterior Índice

50. Usando o bzip2 para compactar novamente outros formatos

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


Página seguinte Página anterior Índice