Nästa Föregående Innehållsförteckning

9. Använda bzip2 för att packa om andra packningsformat

Följande perl-program tar filer som komprimerats i andra format (.tar.gz, .tgz, .tar.Z och .Z för denna gång) och packar om dem med bättre komprimering. Perl-koden har alla typer av trevlig dokumentation om vad den gör och hur den gör det den gör.

#!/usr/bin/perl -w

#######################################################
#                                                     #
# Detta program tar packade och gzippade program i    #
# i den aktuella katalogen och gör om dem till bzip2- #
# format. Det klarar av .tgz-ändelsen på ett hyffsat  #
# sätt och skapar en .tar.bz2-fil.                    #
#                                                     #
#######################################################
$counter = 0;
$saved_bytes = 0;
$totals_file = '/tmp/machine_bzip2_total';
$machine_bzip2_total = 0;

@files = <*[Zz]>;
$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 "Packar om $_ ($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 är ungefär $factor% av storleken på $_. :",($factor<100)?')':'(',"\n";
        unlink $_;
    } else {
        print "Arrgghh!  Något hände med $_: $!\n";
    }
}
print "Du har ",
      ($saved_bytes>=0)?"sparat":"förlorat",
      " $saved_bytes byte lagringsutrymme :",
       ($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 "Kan inte öppna systemvid totalitet: $!";
$machine_bzip2_total += $saved_bytes;
print TOTAL $machine_bzip2_total;
close TOTAL;

print "Maskinvid totalitet av ",`cat $totals_file`," byte sparade.\n";

Nästa Föregående Innehållsförteckning