Аннотация |
В этом документе содержится информация о том, как пользоваться новым архиватором bzip2. Копию этого документа в формате sgml можно найти здесь и здесь. |
Bzip2 - это принципиально новый, мощный алгоритм сжатия данных. Его файлы обычно составляют 60-70% размера своих gzip-собратьев.
Этот документ содержит описание некоторых способов применения bzip2.
Будущие версии этого документа будут включать в себя описание возможностей libbzip2, C-библиотеки bzip2, которую написал автор bzip2 Julian Seward. Руководство по bzip2, включающее в себя подробную информацию о библиотеке, можно найти здесь.
В будущие версии этого документа может войти сокращенная версия обсуждения, посвященного тому, куда и как внести bzip2 в ядро Linux.
Изменен раздел "Использование bzip2 совместно с less", чтобы была возможность чтения файлов .tar.bzip2. Спасибо Nicola Fabiano за исправления.
Обновлена утилита buzzit.
Обновлена информация о tar.
Обновлен раздел "Где получить скомпилированный bzip2", в том числе добавлена информация о S.u.S.E.
Исправлена опечатка и подправлены некоторые идиомы shell в разделе "Использование bzip2 совместно с tar". Спасибо Alessandro Rubini за это.
Обновлена утилита buzzit - теперь она не изменяет исходный bzip2-архив.
Добавлена утилита bgrep, аналог zgrep.
Устранена проблема с gcc 2.7.*. Спасибо Ulrik Dickow за то, что указал на это.
Добавлен "элегантный" путь работы с tar, предложенный Leonard Jean-Marc.
Добавлена ссылка на шведский перевод Linus цkerlund.
По предложению Arnaud Launay, исправлен раздел, касающийся wu-ftpd.
Переводы помещены в отдельный раздел.
buzzit и tar.diff помещены в sgml, где им и место. Исправлены ошибки в пунктуации и форматировании. Спасибо Arnaud Launay, за помощь в исправлении моей копии. :-)
Отказ на время от проекта xv, из-за отсутствия интереса.
Добавлены заметки о том, что надо сделать в следующих версиях документа.
Добавлена заметка о Netscape.
Подправлен скрипт lesspipe.sh. Теперь он должен работать лучше.
Добавлен файл .emacs для версий 19.30 или выше от Ulrik Dickow.
(Также исправлен патч jka-compr.el для emacs. Упс! В Bzip2 до сих пор нет флага "append"!)
Домашняя страничка Bzip2 находится в Великобритании. Зеркало для США находится здесь.
Франкоязычные пользователи возможно захотят воспользоваться документацией, переведенной Arnaud Launay. Веб-версия находится здесь, а ftp здесь. Почту для Arnaud можно посылать по этому адресу.
Есть перевод, выполненный Tetsu Isaji, на японский. Домашняя страничка Isaji находится по этому адресу, а письма ему можно посылать на этот адрес.
Также существует шведский перевод, выполненный Linus цkerlund. Контактный адрес Linus находится здесь.
Если у вас 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 с архиватором tar.
Этот способ не предусматривает никакой дополнительной установки. Чтобы разархивировать tar-архив foo.tar.bz2, запакованый bzip2, находящийся в текущем каталоге, надо
/path/to/bzip2 -cd foo.tar.bz2 | tar xf - |
tar --use-compress-prog=bzip2 xf foo.tar.bz2 |
Благодарим 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' |
Обновите tar в соответствии с последней версией GNU, на данный момент это 1.13.10. Вы можете это сделать на GNU's ftp site или каком-либо зеркале.
Для разархивирования на лету файлов, сжатых 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 |
Я написал следующий патч на jka-compr.el, который переводит bzip2 в режим авто-архивирования.
Предупреждение: Я проверил это только с emacs-20.2, но думаю, что проблем не будет и с другими версиями. |
Как это сделать,
Зайдите в каталог исходников emacs-20.2/lisp (после того, как разархивируете его)
Разместите патч в файл jka-compr.el.diff (он должен быть один в этом файле ;).
Выполните
patch < jka-compr.el.diff |
Запустите emacs и выполните
M-x byte-compile-file jka-compr.el |
Выйдите из emacs.
перенесите исходный файл jka-compr.elc в безопасное место для защиты от глюков.
Замените его новым jka-compr.elc.
Возрадуйтесь!
--- 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") |
Благодарим 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) |
Спасибо 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 |
Следующая утилита, которую я называю 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 |
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 |
Нижеследующая программа, написанная на языке 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@metalab.unc.edu> или к координатору русского перевода Linux HOWTO компании ASPLinux по адресу <linux-howto@asplinux.ru>