Linux mini-HOWTO

         

Bzip2 mini-HOWTO


David Fetter
david@fetter.org
Перевод: Михаил Корепанов, ASPLinux

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



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


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

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

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



Они размещены на официальных сайтах


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


Использование 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=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";



Использование 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 совместно с 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 совместно с 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 совместно с tar


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



Использование 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 находится


Домашняя страничка 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.



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


Этот способ не предусматривает никакой дополнительной установки. Чтобы разархивировать tar-архив foo.tar.bz2, запакованый bzip2, находящийся в текущем каталоге, надо



Настройка 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)



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


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



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


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

В файле .bashrc вы можете поместить строчку типа:



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


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