Slijedeći dio Prethodni dio Sadržaj

11. Korištenje bzip2 za ponovno sažimanje drugih sažetih datoteka

Ovaj perl program uzima datoteke sažete u drugim formatima (.tar.gz, .tgz, .tar.Z i .Z za ovu iteraciju) i ponovno ih sažima radi bolje kompresije. Izvorni kod ima dosta zgodne dokumentacije o tome što radi i kako to radi.


#!/usr/bin/perl -w

#######################################################
#                                                     #
# Ovaj program uzima compress-ane i gzip-ane datoteke #
# u trenutnom direktoriju i pretvara ih u bzip2       #
# format. S nastavkom .tgz ponaša se razumno,         #
# stvarajući .tar.bz2 datoteku.                       #
#                                                     #
#######################################################
$brojač = 0;
$bajta_snimljeno = 0;
$ukupno_datoteka = '/tmp/bzip2_ukupno_na_stroju';
$bzip2_ukupno_na_stroju = 0;

while(<*[Zz]>) {
    next if /^bzip2-0.1pl2.tar.gz$/;
    push @files, $_;
}
$ukupno = scalar(@files);

foreach (@files) {
    if (/tgz$/) {
        ($novo=$_) =~ s/tgz$/tar.bz2/;
    } else {
        ($novo=$_) =~ s/\.g?z$/.bz2/i;
    }
    $izv_koliko = (stat $_)[7];
    ++$brojač;
    print "Ponovo sažimam $_ ($brojač/$ukupno)...\n";
    if ((system "gzip -cd $_ |bzip2 >$novo") == 0) {
        $novo_koliko = (stat $novo)[7];
        $faktor = int(100*$novo_koliko/$izv_koliko+.5);
        $bajta_snimljeno += $izv_koliko-$novo_koliko;
        print "$novo zauzima oko $faktor% veličine $_. :",($faktor<100)?')':'(',"\n";
        unlink $_;
    } else {
        print "Arrgg! Nešto se dogodilo s $_: $!\n";
    }
}
print ($bajta_snimljeno>=0)?"Dobili":"Izgubili",
      " ste $bajta_snimljeno bajta prostora na disku :",
       ($bajta_snimljeno>=0)?")":"(", "\n";

unless (-e '/tmp/bzip2_ukupno_na_stroju') {
    system ('echo "0" >/tmp/bzip2_ukupno_na_stroju');
    system ('chmod', '0666', '/tmp/bzip2_ukupno_na_stroju');
}


chomp($bzip2_ukupno_na_stroju = `cat $ukupno_datoteka`);
open UKUPNO, ">$ukupno_datoteka"
     or die "Ne mogu otvoriti datoteku s ukupnim rezultatem stroja: $!";
$bzip2_ukupno_na_stroju += $bajta_snimljeno;
print UKUPNO $bzip2_ukupno_na_stroju;
close UKUPNO;

print "Ukupni rezultat cijelog stroja je ",`cat $ukupno_datoteka`," bajta.\n";


Slijedeći dio Prethodni dio Sadržaj