Bzip2 mini-HOWTO <author>David Fetter, <url url="mailto:david@fetter.org" name="david@fetter.org"> <date>v2.00, 22 August 1999 <trans>역자 : 이호연 <<url url="mailto:guru2k@kldp.org" name="guru2k@kldp.org" >> <abstract> 이 문서는 새로운 압축 프로그램인 bzip2를 어떻게 사용하는지 이야기한다. sgml의 로컬카피는 현재의 사이트 <Bzip2-HOWTO.sgml> 에 있고, "권위가 있는" sgml은 <<url url="http://fetter.org/Bzip2-HOWTO/" name="fetter.org/Bzip2-HOWTO">> 에 있다. </abstract> <toc> <sect> 소개<p> Bzip2는 자료를 압축하기 위한 좋은 새로운 알고리즘이다. 일반적으로 gzip으로 한 것 보다 60-70%의 크기로 만든다. 이 문서는 당신을 bzip2를 통하여 일반 애플리케이션을 이용하게 만들 것이다. 이 문서의 미래의 버전은 bzip2를 만든 Julian Seward <<url url="mailto:Julian_Seward@muraroa.demon.co.uk" name="Julian_Seward@muraroa.demon.co.uk">> 가 친절히 쓴 bzip2 C 라이브러리인 libbzip2가 있을 것이다. 라이브러리에 관한 낮은 레벨의 bzip2 메뉴얼이 <<url url="http://www.bzip2.org/bzip2/docs/manual_toc.html" name="www.bzip2.org/bzip2/docs/manual_toc.html" >> 에 있다. 이 문서의 미래의 버전들은 아마 또한 bzip2를 리눅스 커널에서 써야하는지 (그리고 어떻게)에 관한 해설에 대한 요약을 포함할 것이다. </p> <sect1>개정판 역사 <sect2> v2.00<p> ``Bzip2를 less와 같이 사용하기'' 부분이 변경되었다 그래서 .tar.bzip2 파일을 실제로 읽을수 있다. 정정한 것에 대해 Nicola Fabiano <<url url="mailto:mc864mclink.it" name="mc864mclink.it" >> 에게 감사한다. buzzit 유틸리티가 갱신되었다. tar 정보가 갱신되었다. </p> <sect2> v1.92<p> ``Bzip2 바이너리 얻기'' 부문이 변경되었고, S.u.S.E.에 추가한 것을 포함 한다. </p> <sect2> v1.91<p> 오타가 교정되었고 ``Bzip2를 tar과 같이 쓰는 부문''의 셸 표현형식의 일 부를 깨끗하게 했다. 이 것들에 대해 Alessandro Rubini에게 감사한다. 최초의 bzip2 데이터를 짓밟지 않기 위해 buzzit 툴을 갱신했다. Zgrep같은 툴인 bgrep가 추가되었다. </p> <sect2> v1.9<p> Gcc 2.7.* 문제를 깨끗하게 했다. 이것을 지적한 Ulrik Dickow에게 감사한다. Leonard Jean-Marc의 훌륭한 tar과 같이 사용하는 방법이 추가되었다. Linux Akerlund의 스웨덴 번역이 추가되었다. Arnaud Launay의 제안으로 wu-ftpd 부문을 고쳤다. 번역들이 그들 자신의 부문으로 옮겨졌다. </p> <sect2> v1.8<p> Buzzit과 그것들이 속한곳의 sgml의 tar.diff를 넣었다. 구두점과 형식을 수정했다. Arnaud Launay에게 나의 복사를 정정한 그의 도움에 대해 감사 한다. :-) 대중의 관심 부족으로 새로운 적당한 xv 프로젝트를 했다. 이 문서의 미래의 버전을 위한 문제를 추가했다. </p> <sect2> v1.7<p> Buzzit 유틸리티가 추가되었다. Gnu tar에 대한 패치를 고쳤다. </p> <sect2> v1.6<p> TenThumbs의 Netscape enabler가 추가되었다. 또한 그의 제안으로 lesspipe.sh를 변경했다. 지금보다 훌륭하게 작동할 것이다.</p> <sect2> v1.5<p> Arnaud Launay의 프랑스어 번역, 그리고 그의 wu-ftpd 파일이 추가되었다. </p> <sect2> v1.4<p> Tetsu Isaji의 일본 번역이 추가되었다. </p> <sect2> v1.3<p> Ulrik Dickow의 19.30와 더 높은 수준의 .emacs가 추가되었다. (또한 그의 제안으로 emacs의 jka-compr.el패치가 정정되었다. 이런! Bzip2의 플래그가 아직(?) 없군.) </p> <sect2> v1.2<p> Emacs의 패치가 변경되어서 자동적으로 .bz2 파일들을 인식한다. </p> <sect2> v1.1<p> Emacs의 패치가 추가되었다. </p> <sect2> v1.0<p> 라운드 1.</p> <sect> Bzip2 얻기<p> Bzip2의 홈페이지는 영국 홈 사이트인 <<url url="http://www.bzip2.org/" name="www.bzip2.org">>에 있고. 미국 미러사이트는 <<url url="http://www.digistar.com/bzip2/index.html" name="www.digistar.com/bzip2/index.html">> 에 있다. </p> <sect1> 당신의 언어의 bzip2-HOWTO<p> 프랑스인들은 아마 Arnaud Launay의 프랑스어 문서를 참고하기를 바랄 것이다. 웹 버전은 <<url url="http://www.freenix.fr/linux/HOWTO/mini/Bzip2.html" name="www.freenix.fr/linux/HOWTO/mini/Bzip2.html" >> 에 있고, ftp는 <url url="ftp://ftp.lip6.fr/pub/linux/french/docs/HOWTO/mini/Bzip2.gz" name="ftp.lip6.fr/pub/linux/french/docs/HOWTO/mini/Bzip2.gz" > 여기 있다. Arnaud와 전자메일로 연락할 수 있다. 메일 주소는 <<url url="mailto:zoro@mygale.org" name="zoro@mygale.org" >> 이다. 일본인들은 아마 Tetsu Isaji의 일본어 문서를 참조하기를 바랄 것이다. 문서는 <<url url="http://jf.gee.kyoto-u.ac.jp/JF/JF.html" name="jf.gee.kyoto-u.ac.jp/JF/JF.html" >> 에 있다. Isaji의 홈페이지 <<url url="http://www2s.biglobe.ne.jp/~kaien/" name="www2s.biglobe.ne.jp/~kaien/" >>에서 연락할수 있고, 혹은 전자메일로 할 수 있다. 메일 주소는 <<url url="mailto:isaji@mxu.meshnet.or.jp" name="isaji@mxu.meshnet.or.jp">> 이다. 스웨덴인들은 아마 Linus Akerlund의 스웨덴어 문서를 참조하기를 바랄 것이 다. 문서는 <<url url="http://user.tninet.se/~uxm165t/linux_doc.html" name="user.tninet.se/~uxm165t/linux_doc.html" >> 에 있다. Linus와 전자메일로 연락할수 있다. 메일 주소는 <<url url="mailto:uxm165t@tninet.se" name="uxm165t@tninet.se">> 이다. </p> <sect1> 컴파일된 bzip2 바이너리 얻기<p> 홈 사이트를 봐라.</p> <sect1> Bzip2 소스 얻기<p> 공식적인 사이트에 있다 (``Bzip2 얻기'' 를 봐라.</p> <sect1> 당신의 컴퓨터로 bzip2 컴파일하기<p> 만약 당신이 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의 잘못된 코 드를 생성하는 많은 원인이 되고, gcc 2.7의 코드가 더 느리고 더 커지기 때문이다. 다른 컴파일러들 (lcc, egcs, gcc 2.8.x)을 위해 디폴트 CFLAGS 가 좋다. 그 후, README대로 바로 그것을 만들고 설치해라. </p> <sect> Bzip2를 단독으로 쓰기 <p> 좋은 메뉴얼 페이지를 읽어봐라 :)</p> <sect> Bzip2를 tar과 같이 쓰기<p> 바꾸어 말하면 bzip2를 tar과 같이 쓰는 세가지 방법이 밑에 리스트 된다. </p> <sect1> 가장 쉬운 설치:<p> 이 방법은 전혀 설치가 필요하지 않다. 현재 디렉토리의 foo.tar.bz2처럼 tar과 bzip2로 압축된 것을 풀려면 /path/to/bzip2 -cd foo.tar.bz2 | tar xf - 또는 tar --use-compress-prog=bzip2 xf foo.tar.bz2 이 작업은 종종 PITA 가 될 수도 있다. </p> <sect1> root 특권 없이 쉽게 설치하고 사용하기:<p> 팁에 대해 Leonard Jean-Marc <<url url="mailto:leonard@sct1.is.belgacom.be" name="leonard@sct1.is.belgacom.be" >>에게 감사한다. csh와 bash 구별이 생기는 것에 대해 Alessandro Rubini <<url url="mailto:rubini@morgana.systemy.it" name="rubini@morgana.systemy.it" >> 에게 역시 감사한다. 당신의 .bashrc, 이것과 같은 라인을 넣어라: alias btar='tar --use-compress-program /usr/local/bin/bzip2 ' 당신의 .tcshrc, 또는 .cshrc, 이것과 유사하게 보이는 라인: alias btar 'tar --use-compress-program /usr/local/bin/bzip2' </p> <sect1> 루트의 접근이 필요하지만 쉽게 사용하기.<p> 당신의 tar을 GNU의 가장 새로운 버전으로 갱신해라, 현재는 1.13.10이다. 그것은 GNU의 ftp 사이트 <url url="ftp://alpha.gnu.org/gnu/tar/" name=" alpha.gnu.org/gnu/tar/" >에서 찾을 수 있고 혹은 어떤 미러. </p> <sect> Bzip2를 less와 같이 쓰기<p> bzip2으로 압축된 파일을 bunzip2 없이 less를 이용하려면 lesspipr.sh (man less) 파일을 다음과 같이 만들어라: <code> #!/bin/sh # This is a preprocessor for 'less'. It is used when this environment # variable is set: LESSOPEN="|lesspipe.sh %s" case "$1" in *.tar) tar tvvf $1 2>/dev/null ;; # View contents of various tar'd files *.tgz) tar tzvvf $1 2>/dev/null ;; # This one work for the unmodified version of tar: *.tar.bz2) bzip2 -cd $1 $1 2>/dev/null | tar tvvf - ;; #This one works with the patched version of 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 ;; # View compressed files correctly *.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` ; # Check to see if binary, if so -- view with '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 </code> </p> <sect> Bzip2를 emacs와 같이 쓰기 <sect1> 모두를 위해 emacs 바꾸기: <p> 나는 자동압축모드를 추가한 jka-compr.el 패치에 따라 썼다. 부인서: 나는 emacs-20.0에서만 테스트를 해봤다, 그러나 다른 버전에 비슷 하게 접근하지 못한다고 믿을 이유가 없다. 이 것을 써라, <enum> <item> emacs-20.2/lisp 소스 디렉토리에 가라 (당신이 tar을 푼 곳) <item> jka-compr.el.diff 부르는 파일의 아래에 패치를 놓아라 (그 것은 저 파일 에 단독으로 있어야한다 ;). <item> 해라 patch < jka-compr.el.diff <item> Emacs를 시작해라, 그리고 해라 M-x byte-compile-file jka-compr.el <item> Emacs를 종료해라. <item> 당신의 최초의 jka-compr.elc를 버그의 케이스안의 안전한 곳으로 옮겨라. <item> 새로운 jka-compr.elc와 그 것을 바꿔라. <item> 즐겨라! </enum> <code> --- 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 <url url="http://www.muraroa.demon.co.uk" name="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") </code> </p> <sect1> 한 사람을 위해 emacs 바꾸기:<p> Kampsax Technology에 있는 시스템 프로그래머인 Ulrik Dickow, <url url="mailto:ukd@kampsax.dk" name="ukd@kampsax.dk" > <mailto:ukdATkampsax.dk> 에게 이것에 관해 감사한다: 당신이 시스템관리자가 아닐때 그것을 만들면 bzip2를 자동적으로 쓸 수 있다. 당신의 .emacs 파일다음에 지금 추가해라. <code> ;; 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) </code> </p> <sect> Bzip2를 wu-ftpd와 같이 쓰기<p> Arnaud Launay에게 이 bandwidth 세이버에 대해 감사한다. 이것은 bzip2 압축과 압축해제를 /etc/ftpconversions 에 한다. 경로를 정확히 해야 할 것을 명심하라. <code> :.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 </code> </p> <sect> Bzip2를 grep와 같이 쓰기<p> 내가 bgrep을 실행할 때에는 linux 와 같이 오는 zgrep에 사소한 수정이 가해진다. 당신은 bunzip2 명령의 사용 없이도 일단은 grep을 사용할 수 있을 것이다. <code> #!/bin/sh # bgrep -- a wrapper around a grep program that decompresses files as needed 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 </code> </p> <sect> Bzip2를 X의 넷스케이프과 같이 쓰기.<p> <url url="mailto:tenthumbs@cybernex.net " name="tenthumbs@cybernex.net >says: 나는 gzip이 사용되던 리눅스용 넷스케이프에서의 문서의 인코딩을 bzip2를 이용하여 할 수 있는 방법도 찾아내었다. 다음을 $HOME/.Xdefaults 이나 $HOME/.Xresources 에 추가해라. 나는 -s 옵션을 사용했는데 그것은 램의 사용상 어떤 경우에는 압축 해제 속도가 더 빨랐기 때문이다. 당신은 원한다면 이 옵션은 빼도 좋을 것이다. <code> 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 </code> </p> <sect> Bzip2로 다른 압축 형식으로 압축된걸 다시 압축하기<p> 펄 프로그램을 이용하여 한 번 압축된 (.tar.gz, .tgz, .tar.Z, .Z, 혹은 기타) 파일을 더 나은 압축파일로 다시 압축할 수 있다. 이 펄 소스는 무엇을 할 것인가와 무엇을 어떻게 할 것인가에 대한 모든 종류의 간결한 문서를 포함하고 있다. 이것의 최종 버전은 명령행에 파일 이름을 입력하게 한다. 명령행에서 따로이 지정된 것이 없으면 그것은 작업 디렉토리 안의 모든 것을 다시압축한다. <code> #!/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; @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"; </code> </p> </article>