Bzip2 mini-HOWTO

David Fetter

Перевод: Михаил Корепанов, ASPLinux

Аннотация

В этом документе содержится информация о том, как пользоваться новым архиватором bzip2. Копию этого документа в формате sgml можно найти здесь и здесь.


Содержание
Введение
Как получить bzip2
Использование bzip2
Использование bzip2 совместно с tar
Использование bzip2 совместно с less
Использование bzip2 совместно с emacs
Использование bzip2 совместно wu-ftpd
Использование bzip2 совместно с grep
Использование bzip2 совместно с Netscape под X.
Использование bzip2 для преобразования из других форматов
Авторские права

Введение

Bzip2 - это принципиально новый, мощный алгоритм сжатия данных. Его файлы обычно составляют 60-70% размера своих gzip-собратьев.

Этот документ содержит описание некоторых способов применения bzip2.

Будущие версии этого документа будут включать в себя описание возможностей libbzip2, C-библиотеки bzip2, которую написал автор bzip2 Julian Seward. Руководство по bzip2, включающее в себя подробную информацию о библиотеке, можно найти здесь.

В будущие версии этого документа может войти сокращенная версия обсуждения, посвященного тому, куда и как внести bzip2 в ядро Linux.


История изменений

Версия 2.00

Изменен раздел "Использование bzip2 совместно с less", чтобы была возможность чтения файлов .tar.bzip2. Спасибо Nicola Fabiano за исправления.

Обновлена утилита buzzit.

Обновлена информация о tar.


Версия 1.92

Обновлен раздел "Где получить скомпилированный bzip2", в том числе добавлена информация о S.u.S.E.


версия 1.91

Исправлена опечатка и подправлены некоторые идиомы shell в разделе "Использование bzip2 совместно с tar". Спасибо Alessandro Rubini за это.

Обновлена утилита buzzit - теперь она не изменяет исходный bzip2-архив.

Добавлена утилита bgrep, аналог zgrep.


Версия 1.9

Устранена проблема с gcc 2.7.*. Спасибо Ulrik Dickow за то, что указал на это.

Добавлен "элегантный" путь работы с tar, предложенный Leonard Jean-Marc.

Добавлена ссылка на шведский перевод Linus цkerlund.

По предложению Arnaud Launay, исправлен раздел, касающийся wu-ftpd.

Переводы помещены в отдельный раздел.


Версия 1.8

buzzit и tar.diff помещены в sgml, где им и место. Исправлены ошибки в пунктуации и форматировании. Спасибо Arnaud Launay, за помощь в исправлении моей копии. :-)

Отказ на время от проекта xv, из-за отсутствия интереса.

Добавлены заметки о том, что надо сделать в следующих версиях документа.


Версия 1.7

Добавлена утилита buzzit. Добавлен патч для gnu tar.


Версия 1.6

Добавлена заметка о Netscape.

Подправлен скрипт lesspipe.sh. Теперь он должен работать лучше.


Версия 1.5

Добавлен французский перевод Arnaud Launay, а также его файл wu-ftpd.


Версия 1.4

Добавлен японский перевод Tetsu Isaji.


Версия 1.3

Добавлен файл .emacs для версий 19.30 или выше от Ulrik Dickow.

(Также исправлен патч jka-compr.el для emacs. Упс! В Bzip2 до сих пор нет флага "append"!)


Версия 1.2

Изменен патч для emacs - теперь он автоматически распознает файлы .bz2.


Версия 1.1

Добавлен патч для emacs.


Версия 1.0

1-ый раунд.


Как получить bzip2

Домашняя страничка Bzip2 находится в Великобритании. Зеркало для США находится здесь.


Где получить руководство Bzip2-HOWTO на родном языке

Франкоязычные пользователи возможно захотят воспользоваться документацией, переведенной Arnaud Launay. Веб-версия находится здесь, а ftp здесь. Почту для Arnaud можно посылать по этому адресу.

Есть перевод, выполненный Tetsu Isaji, на японский. Домашняя страничка Isaji находится по этому адресу, а письма ему можно посылать на этот адрес.

Также существует шведский перевод, выполненный Linus цkerlund. Контактный адрес Linus находится здесь.


Где получить скомпилированный bzip2

Просмотрите домашние странички.


Где взять исходники bzip2

Они размещены на официальных сайтах (смотрите главу "Как получить bzip2").


Компилирование bzip2 для вашей машины

Если у вас gcc 2.7.*, исправьте следующую строку:
CFLAGS = -O3 -fomit-frame-pointer -funroll-loops

на
CFLAGS = -O2 -fomit-frame-pointer

Это заменяет -O3 на -O2 и опускает ключ -funroll-loops. Вы, возможно, захотите добавить еще флаги -m* (например -m486).

Неупотребление ключа -funroll-loops, является обязательным условием. Иначе gcc 2.7 соберет неправильную программу, или, в лучшем случае, большую и медленную. Для других компиляторов (lcc, egcs, gcc 2.8.x) установки по умолчанию стоят правильно.

После всего, выполните команду make и установите, как описано в README.


Использование bzip2

Читайте документацию (RTFM) :)


Использование bzip2 совместно с tar

Ниже приводятся три способа использования bzip2 с архиватором tar.


Наиболее простой в установке:

Этот способ не предусматривает никакой дополнительной установки. Чтобы разархивировать tar-архив foo.tar.bz2, запакованый bzip2, находящийся в текущем каталоге, надо
/path/to/bzip2 -cd foo.tar.bz2 | tar xf -
или
tar --use-compress-prog=bzip2 xf foo.tar.bz2


Простой в установке, прост в использовании , нет необходимости в root-правах:

Благодарим Leonard Jean-Marc за подсказки. Также спасибо Alessandro Rubini за разграничение bash и csh.

В файле .bashrc вы можете поместить строчку типа:
alias btar='tar --use-compress-program /usr/local/bin/bzip2 '

В файле .tcshrc, или файле .cshrc, аналогичная строка выглядит следующим образом:
alias btar 'tar --use-compress-program /usr/local/bin/bzip2'


Так же прост в использовании, но требует наличия root-прав.

Обновите tar в соответствии с последней версией GNU, на данный момент это 1.13.10. Вы можете это сделать на GNU's ftp site или каком-либо зеркале.


Использование bzip2 совместно с less

Для разархивирования на лету файлов, сжатых bzip2, например, для использования "less", до того, как их разархивировать bunzip2, вы можете сделать файл lesspipe.sh (man less) следующим образом:

#!/bin/sh
# Это процессор для 'less'.  Это используется когда установлена переменная окружения

# variable is set:   LESSOPEN="|lesspipe.sh %s"

  case "$1" in
  *.tar) tar tvvf $1 2>/dev/null ;; # Просмотр списка различных файлов архивированных tar
  *.tgz) tar tzvvf $1 2>/dev/null ;;
# Эта строка работает со старой версией tar:
  *.tar.bz2) bzip2 -cd $1 $1 2>/dev/null | tar tvvf - ;;
# Эта строка работает с обновленной версией 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 ;; # Корректный просмотр файлов
  *.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 src
    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` ; # Проверяет файл на двоичный формат , если так -- просматривает при помощи 'strings'
#    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


Использование bzip2 совместно с emacs

Настройка emacs для всех:

Я написал следующий патч на jka-compr.el, который переводит bzip2 в режим авто-архивирования.

Предостережение

Предупреждение: Я проверил это только с emacs-20.2, но думаю, что проблем не будет и с другими версиями.

Как это сделать,

  1. Зайдите в каталог исходников emacs-20.2/lisp (после того, как разархивируете его)

  2. Разместите патч в файл jka-compr.el.diff (он должен быть один в этом файле ;).

  3. Выполните
     patch < jka-compr.el.diff

  4. Запустите emacs и выполните
     M-x byte-compile-file jka-compr.el

  5. Выйдите из emacs.

  6. перенесите исходный файл jka-compr.elc в безопасное место для защиты от глюков.

  7. Замените его новым jka-compr.elc.

  8. Возрадуйтесь!

--- 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 @@
 ;; The variable, jka-compr-compression-info-list can be used to
 ;; customize jka-compr to work with other compression programs.
 ;; The default value of this variable allows jka-compr to work with
-;; Unix compress and gzip.
+;; Unix compress and gzip.  David Fetter added bzip2 support :)
 ;;
 ;; If you are concerned about the stderr output of gzip and other
 ;; compression/decompression programs showing up in your buffers, you
@@ -121,7 +121,9 @@
 
 
 ;;; I have this defined so that .Z files are assumed to be in unix
-;;; compress format; and .gz files, in gzip format.
+;;; compress format; and .gz files, in gzip format, and .bz2 files,
+;;; in the snappy new bzip2 format from http://www.muraroa.demon.co.uk.
+;;; Keep up the good work, people!
 (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")


Настройка emacs для одного пользователя:

Благодарим Ulrik Dickow, ukd@kampsax.dk, системного программиста Kampsax Technology:

Если вы не являетесь системным администратором и хотите, чтобы bzip2 работал автоматически, просто добавьте следующее в файл .emacs.

;; Automatic (un)compression on loading/saving files (gzip(1) and similar)
;; We start it in the off state, so that bzip2(1) support can be added.
;; Code thrown together by Ulrik Dickow for ~/.emacs with Emacs 19.34.
;; Should work with many older and newer Emacsen too.  No warranty though.
;;
(if (fboundp 'auto-compression-mode) ; Emacs 19.30+
    (auto-compression-mode 0)
  (require 'jka-compr)
  (toggle-auto-compression 0))
;; Now add bzip2 support and turn auto compression back on.
(add-to-list 'jka-compr-compression-info-list
             ["\\.bz2\\(~\\|\\.~[0-9]+~\\)?\\'"
              "zipping"        "bzip2"         ()
              "unzipping"      "bzip2"         ("-d")
              nil t])
(toggle-auto-compression 1 t)

Использование bzip2 совместно wu-ftpd

Спасибо Arnaud Launay, за идею, позволяющую снизить траффик. Следующее должно входить в /etc/ftpconversions для того, чтобы была возможность выполнять архивирование и разархивирование на лету, при помощи bzip2. Удостоверьтесь, что путь (like /bin/compress) правильный.

 :.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

Использование bzip2 совместно с grep

Следующая утилита, которую я называю bgrep, является небольшой модификацией zgrep, поставляемой вместе с Linux. Вы можете использовать grep без предварительной распаковки файлов.

#!/bin/sh

# bgrep -- программа которая позволяет пользоваться grep без предварительной распаковки файлов
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 is buggy with -e on 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 "grep through bzip2 files"
  echo "usage: $prog [grep_options] pattern [files]"
  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

Использование bzip2 совместно с Netscape под X.

tenthumbs@cybernex.net утверждает:

Я также нашел способ заставить Linux Netscape использовал bzip2 для Content-Encoding так, как он использует gzip. Добавьте нижеследующее в $HOME/.Xdefaults или $HOME/.Xresources

Я использую опцию -s потому, что я бы лучше уменьшил скорость распаковки, ослабив загрузку оперативной памяти. Но вы можете этим не воспользоваться.

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

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

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

#!/usr/bin/perl -w

#######################################################
#                                                     #
# Программа берет сжатые файлы в текущем каталоге     #
# и преобразует в файлы bzip2. Она поддерживает .tgz  #
# расширения преобразуя их в .tar.bz2                 #
#                                                     #
#######################################################
$counter = 0;
$saved_bytes = 0;
$totals_file = '/tmp/machine_bzip2_total';
$machine_bzip2_total = 0;

@raw = (defined @ARGV)?@ARGV:<*>;

foreach(@raw) {
    next if /^bzip/;
    next unless /\.(tgz|gz|Z)$/;
    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 "
    , abs($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";

Авторские права

Авторские права на русский перевод этого текста принадлежат ╘ 2000 ASPLinux Все права зарезервированы.

Этот документ является частью проекта Linux HOWTO.

Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе, физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но, так или иначе, автор текста и автор перевода желали бы знать о таких дистрибутивах.

Все переводы и производные работы, выполненные по документам Linux HOWTO, должны сопровождаться этой заметкой об авторских правах. Это делается в целях предотвращения случаев наложения дополнительных ограничений на распространение документов HOWTO. Исключения могут составить случаи получения специального разрешения у координатора Linux HOWTO, с которым можно связаться по адресу приведенному ниже.

Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: или к координатору русского перевода Linux HOWTO компании ASPLinux по адресу