Bzip2

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

Использование 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, но думаю, что проблем не будет и с другими версиями.

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

Зайдите в каталог исходников 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.
+;; 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";