Bzip2 Howto <author>David Fetter, <url url="mailto:dfetter@best.com" name="dfetter@best.com">. Översättning: Linus Åkerlund, <url url="mailto:uxm165t@tninet.se" name="uxm165t@tninet.se">. <date>v1.8 Tue Jun 23 07:44:14 PDT 1998. Översättning: 29 juni 1998 <abstract> Detta dokument går igenom hur du kan använda det nya komprimeringsprogrammet bzip2. Den ursprungliga SGML-versionen finns <url url="http://www.best.com/~dfetter/Bzip2-HOWTO/Bzip2-HOWTO.sgml" name="här">. </abstract> <!-- Table of contents --> <toc> <!-- Begin the document --> <sect>Inledning <p> Bzip2 är en häftig ny algoritm för att komprimera data. Vanligtvis gör det filer till 60-70% av storleken av sina gzippade motsvarigheter. <p> Detta dokument kommer leda dig igenom ett par vanliga användningsområden för bzip2. <p> Framtida versioner av det här dokumentet kommer diskutera det kommande bzip2-biblioteket, vilket programmeraren bakom bzip2, (<htmlurl url="mailto:Julian_Seward@muraroa.demon.co.uk" name="Julian Seward"> beskriver på följande sätt: <verb> Jag arbetar på nästa version av bzip2, vilket kommer använda samma filformat (.bz2); det viktigaste tillägget är ett zlib-liknande bibliotek för att läsa och skriva data i detta filformat inifrån program. </verb> <p> Framtida versioner av detta dokument kan också komma att innehålla en summering av diskussionen om huruvida (och hur) bzip2 bör användas i Linux-kärnan. <sect1> Ändringar <sect2> v1.9 <p> Redde upp gcc 2.7.*-problemet. Tack till Ulrik Dickow för att han påpekade detta. <p> la till Leonard Jean-Marc's eleganta sätta att arbeta med tar. <p> La till Linus Åkerlunds svenska översättning. <p> Fixade avsnittet om wu-ftpd enligt Arnaud Launays förslag. <p> Flytta översättningarna till en egen avdelning. <sect2> v1.8 <p> La buzzit och tar.diff där de hör hemma i SGMLen. Fixade kommatering och formattering. Tack till Arnaud Launay för hans hjälp med att rätta till mitt exemplar. :-) <p> La ner xv-projektet för tillfället, eftersom det inte verkar intressera folk i tillräckligt hög grad. <p> La till några aptitretare om framtida versioner av dokumentet. <sect2> v1.7 <p> La till buzzit-verktyget. Fixade patchen mot gnu tar. <sect2> v1.6 <p> La till TenThumbs Netscape-tillägg. <p> Ändrade även lesspipe.sh enligt hans förslag. Det bör fungera bättre nu. <sect2> v1.5 <p> La till Arnaud Launays franska översättning och hans wu-ftpd-fil. <sect2> v1.4 <p> la till Tetsu Isajis japanska översättning. <sect2> v1.3 <p> La till Ulrik Dickows .emacs för 19.30 och högre. <p> (Rättade också till jka-compr.el-patchen för emacs enligt hans förslag. Hoppsan! Bzip2 har ännu(?) inte en "append"-flagga.) <sect2> v1.2 <p> Ändrade patchen för emacs så att det automatiskt känner igen .bz2-filer. <sect2> v1.1 <p> La till patchen för emacs. <sect2> v1.0 <p> Första omgången. <sect>Skaffa bzip2<label id="get-bzip2"> <p> Bzip2s hemsida finns <url url="http://www.muraroa.demon.co.uk/" name="här">. En spegel i USA finns <url url="http://www.digistar.com/bzip2/index.html" name="här">. Du kan också hitta det på <url url="ftp://ftp.redhat.com/pub/contrib" name="Red Hats ftp-sajt">. <sect1>Bzip2-HOWTOn på ditt eget språk <p> Fransktalande kan ta en titt på Arnaud Launays franska översättning. Webb-versionen finns <url url="http://www.freenix.fr/linux/HOWTO/mini/Bzip2.html" name="här">, och du kan ftp-a den från <url url="ftp://ftp.lip6.fr/pub/linux/french/docs/HOWTO/mini/Bzip2.gz" name="denna sajt"> Arnaud kan kontaktas via e-post på <htmlurl url="mailto:zoro@mygale.org" name="denna adress">. <p> De som talar japanska kan ta en titt på Tetsu Isajis japanska översättning <url url="http://jf.gee.kyoto-u.ac.jp/JF/JF.html" name="här">. Isaji når du via <url url="http://www2s.biglobe.ne.jp/~kaien/" name="hans hemsida">, eller via e-post, på <htmlurl url="mailto:isaji@mxu.meshnet.or.jp" name="den här adressen">. <p> Svensktalande kan hitta Linus Åkerlunds svenska dokument <url url="http://user.tninet.se/~uxm165t/linux_doc.html" name="här">. Linus kan nås med e-post via <url url="mailto:uxm165t@tninet.se" name="denna adress">. (Jo, ähum, jag valde att översätta även detta.övers.anm :-) <sect1>Skaffa förkompilerade binärfiler av bzip2 <p>Se hemsidan. Red Hats binärpaket för Intel finns <url url="ftp://ftp.redhat.com/pub/contrib/i386/bzip2-0.1pl2-1.i386.rpm" name="här">. Debians finns <url url="ftp://ftp.debian.org/debian/hamm/hamm/binary-i386/utils/bzip2_0.1pl2-4.deb" name="här">, och Slackwares finns <url url="http://www.cdrom.com/pub/linux/slackware-3.4/slakware/a9/bzip2.tgz" name="här">. Du kan också hitta dem på motsvarande ställen på diverse spegel-sajter. <sect1>Skaffa källkoden till bzip2 <p>De finns på den officiella sajten (se <ref id="get-bzip2" name="Skaffa Bzip2">, eller hämta den från <url url="ftp://ftp.redhat.com/pub/contrib/SRPMS/bzip2-0.1pl2-1.src.rpm" name="Red Hat">). <sect1>Kompilera bzip2 för din maskin <p><bf>Om du har gcc 2.7.*</bf>, ändra raden <tscreen><verb> CFLAGS = -O3 -fomit-frame-pointer -funroll-loops </verb></tscreen> <p>till <tscreen><verb> CFLAGS = -O2 -fomit-frame-pointer </verb></tscreen> <p> Byt alltså ut -O3 mot -O2 och ta bort -funroll-loops. Du kan även lägga till -m*-flaggan (t.ex. -m486) som du brukar använda då du kompilerar kärnor. <p> Att undvika -funroll-loops är det viktigaste, eftersom det kan få många gcc 2.7-or att generera felaktig kod och får alla gcc 2.7-or att generera långsammare och större kod. För andra kompilatorer (lcc, egcs, gcc 2.8.x) går det bra med de vanliga CFLAGS. <p> Sedan är det bara att köra ztt/make/ och installera enligt README-filen. <sect>Använda bzip2 självt <p>Läs den fina man-sidan :) <sect>Använda bzip2 med tar <p>Här kommer tre sätt att använda bzip2 med tar: <sect1>Enklast att konfigurera: <p>Denna metod kräver ingen konfigurering alls. För att packa upp det bzip2-ade tar-arkivet foo.tar.bz i den aktuella katalogen, skriv <tscreen><verb> /path/to/bzip2 -cd foo.tar.bz2 | tar xf - </verb></tscreen> <p>Detta fungerar, men det kan vara jobbigt att behöva göra det ofta. <sect1>Enkelt att konfigurera, ganska enkelt att använda, du behöver inte vara root: <p> Tack till <url url="mailto:leonard@sct1.is.belgacom.be" name="Leonard Jean-Marc"> för tipset. <p> Lägg in en rad som denna i din .bashrc (eller .tcshrc eller .cshrc): <tscreen><verb> alias btar='tar --use-compress-program /usr/local/bin/bzip2 ' </verb></tscreen> Also easy to use, but needs root access. <sect1>Också enkelt att använda, men kräver root-rättigheter: <p>Lägg till patchen nedan till gnu tar 1.12 enligt följande metod: <tscreen><verb> cd tar-1.12/src; patch < /sökväg/till/tar.diff </verb></tscreen> Kompilera och installera det och sedan är det bara att köra. Se efter så att både tar och bzip2 finns i din $PATH genom "which tar" och "which bzip2". För att använda det nya tar, skriv bara <tscreen><verb> tar xyf foo.tar.bz2 </verb></tscreen> för att packa upp filen. <p>Att skapa ett nytt arkiv går till på ett liknande sätt: <tscreen><verb> tar cyf foo.tar.bz2 fil1 fil2 fil3...katalog1 katalog2... </verb></tscreen> <p> Här är patchen: <verb> *** tar.c Thu Jun 11 00:09:23 1998 --- tar.c.new Thu Jun 11 00:14:24 1998 *************** *** 196,201 **** --- 196,203 ---- {"block-number", no_argument, NULL, 'R'}, {"block-size", required_argument, NULL, OBSOLETE_BLOCKING_FACTOR}, {"blocking-factor", required_argument, NULL, 'b'}, + {"bzip2", required_argument, NULL, 'y'}, + {"bunzip2", required_argument, NULL, 'y'}, {"catenate", no_argument, NULL, 'A'}, {"checkpoint", no_argument, &checkpoint_option, 1}, {"compare", no_argument, NULL, 'd'}, *************** *** 372,377 **** --- 374,380 ---- PATTERN at list/extract time, a globbing PATTERN\n\ -o, --old-archive, --portability write a V7 format archive\n\ --posix write a POSIX conformant archive\n\ + -y, --bzip2, --bunzip2 filter the archive through bzip2\n\ -z, --gzip, --ungzip filter the archive through gzip\n\ -Z, --compress, --uncompress filter the archive through compress\n\ --use-compress-program=PROG filter through PROG (must accept -d)\n"), *************** *** 448,454 **** Y per-block gzip compression */ #define OPTION_STRING \ ! "-01234567ABC:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hiklmoprstuvwxz" static void set_subcommand_option (enum subcommand subcommand) --- 451,457 ---- Y per-block gzip compression */ #define OPTION_STRING \ ! "-01234567ABC:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hiklmoprstuvwxyz" static void set_subcommand_option (enum subcommand subcommand) *************** *** 805,810 **** --- 808,817 ---- case 'X': exclude_option = 1; add_exclude_file (optarg); + break; + + case 'y': + set_use_compress_program_option ("bzip2"); break; case 'z': </verb> <sect>Använda bzip2 med less <p> För att automatiskt packa upp bzip2-komprimerade filer, det vill säga för att läsa dem med "less" utan att första bunzip2-a dem, så kan du göra en lesspipe.sh (man less) så här: <verb> #!/bin/sh # Detta är en preprocessor för 'less'. Den används när denna miljö- # variabel är angiven: LESSOPEN="|lesspipe.sh %s" case "$1" in *.tar) tar tvvf $1 2>/dev/null ;; # Se innehåll i diverse tar-filer *.tgz) tar tzvvf $1 2>/dev/null ;; # För den icke modifierade versionen av tar: *.tar.bz2) bzip2 -cd $1 $1 2>/dev/null | tar tzvvf - ;; # För den patchade versionen av 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 ;; # Läs komprimerade filer korrekt *.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` ; # Binär? använd i så fall '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 </verb> <sect>Använda bzip2 med emacs <sect1>Ändra emacs för alla: <p>Jag har skrivit följande patch till jka-compr.el, vilket lägger till bzip2 till auto-compression-mode. <p><bf>Tillkännagivande:</bf> Jag har endast testat detta med emacs-20.2, men har ingen anledning att tro att en liknande metod inte skulle fungera med andra versioner. <p>För att använda den, <enum> <item>Gå till katalogen med emacs-20.2/lisp-källkod (var du nu packade upp det). <item>Placera den nedanstående patchen i en fil som heter jka-compr.el.diff (den ska vara ensam i den filen ;). <item>Gör <tscreen><verb> patch < jka-compr.el.diff </verb></tscreen> <item>Kör igång emacs och tryck in <tscreen><verb> M-x byte-compile-file jka-compr.el </verb></tscreen> <item>Lämna emacs. <item>Flytta din ursprungliga jka-compr.elc till ett säkert ställe för säkerhets skull. <item>Ersätt den med den nya jka-compr.elc. <item>Ha skoj! </enum> <verb> --- 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") </verb> <sect1>Ändra emacs för en användare: <p> Tack för det här går till Ulrik Dickow (htmlurl url="mailto:ukd@kampsax.dk" name="ukd@kampsax.dk">, systemprogrammerare på Kampsax Technology: För att få till det så att du automatiskt kan använda bzip2 när du inte är systemadministratör, lägg bara in följande i din .emacs-fil. <verb> ;; Automatisk (de)komprimering på laddade/sparade filer (gzip(1) eller ;; liknande). Vi startar det i av-läge, så att bzip2(1)-stöd kan ;; läggas till. Koden kastades ihop av Ulrik Dickow för ~./emacs med ;; Emacs 19.34. Borde funka med många äldre och nyare Emacsar också. ;; Ingen garanti dock. ;; (if (fboundp 'auto-compression-mode) ; Emacs 19.30+ (auto-compression-mode 0) (require 'jka-compr) (toggle-auto-compression 0)) ;; Lägg nu till bzip2-stöd och slå på auto-komprimering igen. (add-to-list 'jka-compr-compression-info-list ["\\.bz2\\(~\\|\\.~[0-9]+~\\)?\\'" "zipping" "bzip2" () "unzipping" "bzip2" ("-d") nil t]) (toggle-auto-compression 1 t) </verb> <sect>Använda bzip2 med wu-ftpd <p> Tack till Arnaud Launay för denna bandbreddssparare. Det följande ska läggas in i /etc/ftpconversions för att direkt packning och uppackning med bzip2 ska kunna göras. Se till att sökvägarna (som /bin/compress) är korrekta. <verb> :.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 -I -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+BZIP2 </verb> <sect>Använda bzip2 med Netscape under X <p> tenthumbs@cybernex.net säger: <tscreen> Jag kom också på ett sätt att få Linux Netscape att använda bzip2 för Content-Encoding (innehållsavkodning), precis som det använder gzip. Lägg till detta till $HOME/.Xdefaults eller $HOME/.Xresources. <p> Jag använder argumentet -s eftersom jag hellre byter bort en del uppackningshastighet mot RAM-användning. Du kan låta bli att använda den om du vill. </tscreen> <verb> 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 </verb> <sect>Använda bzip2 för att packa om andra packningsformat <p>Följande perl-program tar filer som komprimerats i andra format (.tar.gz, .tgz, .tar.Z och .Z för denna gång) och packar om dem med bättre komprimering. Perl-koden har alla typer av trevlig dokumentation om vad den gör och hur den gör det den gör. <verb> #!/usr/bin/perl -w ####################################################### # # # Detta program tar packade och gzippade program i # # i den aktuella katalogen och gör om dem till bzip2- # # format. Det klarar av .tgz-ändelsen på ett hyffsat # # sätt och skapar en .tar.bz2-fil. # # # ####################################################### $counter = 0; $saved_bytes = 0; $totals_file = '/tmp/machine_bzip2_total'; $machine_bzip2_total = 0; @files = <*[Zz]>; $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 "Packar om $_ ($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 är ungefär $factor% av storleken på $_. :",($factor<100)?')':'(',"\n"; unlink $_; } else { print "Arrgghh! Något hände med $_: $!\n"; } } print "Du har ", ($saved_bytes>=0)?"sparat":"förlorat", " $saved_bytes byte lagringsutrymme :", ($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 "Kan inte öppna systemvid totalitet: $!"; $machine_bzip2_total += $saved_bytes; print TOTAL $machine_bzip2_total; close TOTAL; print "Maskinvid totalitet av ",`cat $totals_file`," byte sparade.\n"; </verb> </article>