Рейтинг@Mail.ru
[Войти] [Зарегистрироваться]

Наши друзья и партнеры

UnixForum
Беспроводные выключатели nooLite

Lines Club

Ищем достойных соперников.




Книги по Linux (с отзывами читателей)

Библиотека сайта или "Мой Linux Documentation Project"

Next Previous Contents

10. Использование bzip2 для повторного сжатия других форматов сомпрессии

Следующая программа на perl берет файлы, сжатые в других форматах (.tar.gz, .tgz. .tar.Z, и .Z для этой итерации), и перепаковывает их для получения лучшего коэффициента сжатия. Исходный текст на perl сам рассказывает о том, что он делает и как заставить его работать.


  #!/usr/bin/perl -w

  #######################################################

  #                                                     #

  # This program takes compressed and gzipped programs  #

  # in the current directory and turns them into bzip2  #

  # format.  It handles the .tgz extension in a         #

  # reasonable way, producing a .tar.bz2 file.          #

  #                                                     #

  #######################################################

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




Next Previous Contents


Эта статья еще не оценивалась
Вы сможете оценить статью и оставить комментарий, если войдете или зарегистрируетесь.
Только зарегистрированные пользователи могут оценивать и комментировать статьи.

Комментарии отсутствуют