Bzip2 Howto David Fetter, dfetter@best.com . Översättning: Linus Åkerlund, uxm165t@tninet.se . v1.8 Tue Jun 23 07:44:14 PDT 1998. Översättning: 29 juni 1998 Detta dokument går igenom hur du kan använda det nya komprimeringspro­ grammet bzip2. Den ursprungliga SGML-versionen finns här . ______________________________________________________________________ Innehållsförteckning 1. Inledning 1.1 Ändringar 1.1.1 v1.9 1.1.2 v1.8 1.1.3 v1.7 1.1.4 v1.6 1.1.5 v1.5 1.1.6 v1.4 1.1.7 v1.3 1.1.8 v1.2 1.1.9 v1.1 1.1.10 v1.0 2. Skaffa bzip2 2.1 Bzip2-HOWTOn på ditt eget språk 2.2 Skaffa förkompilerade binärfiler av bzip2 2.3 Skaffa källkoden till bzip2 2.4 Kompilera bzip2 för din maskin 3. Använda bzip2 självt 4. Använda bzip2 med tar 4.1 Enklast att konfigurera: 4.2 Enkelt att konfigurera, ganska enkelt att använda, du behöver inte vara root: 4.3 Också enkelt att använda, men kräver root-rättigheter: 5. Använda bzip2 med less 6. Använda bzip2 med emacs 6.1 Ändra emacs för alla: 6.2 Ändra emacs för en användare: 7. Använda bzip2 med wu-ftpd 8. Använda bzip2 med Netscape under X 9. Använda bzip2 för att packa om andra packningsformat ______________________________________________________________________ 1. Inledning 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. Detta dokument kommer leda dig igenom ett par vanliga användningsområden för bzip2. Framtida versioner av det här dokumentet kommer diskutera det kommande bzip2-biblioteket, vilket programmeraren bakom bzip2, (Julian Seward beskriver på följande sätt: 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. 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. 1.1. Ändringar 1.1.1. v1.9 Redde upp gcc 2.7.*-problemet. Tack till Ulrik Dickow för att han påpekade detta. la till Leonard Jean-Marc's eleganta sätta att arbeta med tar. La till Linus Åkerlunds svenska översättning. Fixade avsnittet om wu-ftpd enligt Arnaud Launays förslag. Flytta översättningarna till en egen avdelning. 1.1.2. v1.8 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. :-) La ner xv-projektet för tillfället, eftersom det inte verkar intressera folk i tillräckligt hög grad. La till några aptitretare om framtida versioner av dokumentet. 1.1.3. v1.7 La till buzzit-verktyget. Fixade patchen mot gnu tar. 1.1.4. v1.6 La till TenThumbs Netscape-tillägg. Ändrade även lesspipe.sh enligt hans förslag. Det bör fungera bättre nu. 1.1.5. v1.5 La till Arnaud Launays franska översättning och hans wu-ftpd-fil. 1.1.6. v1.4 la till Tetsu Isajis japanska översättning. 1.1.7. v1.3 La till Ulrik Dickows .emacs för 19.30 och högre. (Rättade också till jka-compr.el-patchen för emacs enligt hans förslag. Hoppsan! Bzip2 har ännu(?) inte en "append"-flagga.) 1.1.8. v1.2 Ändrade patchen för emacs så att det automatiskt känner igen .bz2-filer. 1.1.9. v1.1 La till patchen för emacs. 1.1.10. v1.0 Första omgången. 2. Skaffa bzip2 Bzip2s hemsida finns här . En spegel i USA finns här . Du kan också hitta det på Red Hats ftp-sajt . 2.1. Bzip2-HOWTOn på ditt eget språk Fransktalande kan ta en titt på Arnaud Launays franska översättning. Webb-versionen finns här , och du kan ftp-a den från denna sajt Arnaud kan kontaktas via e-post på denna adress. De som talar japanska kan ta en titt på Tetsu Isajis japanska översättning här . Isaji når du via hans hemsida , eller via e- post, på den här adressen. Svensktalande kan hitta Linus Åkerlunds svenska dokument här . Linus kan nås med e- post via denna adress . (Jo, ähum, jag valde att översätta även detta.övers.anm :-) 2.2. Skaffa förkompilerade binärfiler av bzip2 Se hemsidan. Red Hats binärpaket för Intel finns här . Debians finns här , och Slackwares finns här . Du kan också hitta dem på motsvarande ställen på diverse spegel- sajter. 2.3. Skaffa källkoden till bzip2 De finns på den officiella sajten (se ``Skaffa Bzip2'', eller hämta den från Red Hat ). 2.4. Kompilera bzip2 för din maskin Om du har gcc 2.7.*, ändra raden CFLAGS = -O3 -fomit-frame-pointer -funroll-loops till CFLAGS = -O2 -fomit-frame-pointer 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. 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. Sedan är det bara att köra ztt/make/ och installera enligt README- filen. 3. Använda bzip2 självt Läs den fina man-sidan :) 4. Använda bzip2 med tar Här kommer tre sätt att använda bzip2 med tar: 4.1. Enklast att konfigurera: 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 /path/to/bzip2 -cd foo.tar.bz2 | tar xf - Detta fungerar, men det kan vara jobbigt att behöva göra det ofta. 4.2. inte vara root: Enkelt att konfigurera, ganska enkelt att använda, du behöver Tack till Leonard Jean-Marc för tipset. Lägg in en rad som denna i din .bashrc (eller .tcshrc eller .cshrc): alias btar='tar --use-compress-program /usr/local/bin/bzip2 ' Also easy to use, but needs root access. 4.3. Också enkelt att använda, men kräver root-rättigheter: Lägg till patchen nedan till gnu tar 1.12 enligt följande metod: cd tar-1.12/src; patch < /sökväg/till/tar.diff 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 tar xyf foo.tar.bz2 för att packa upp filen. Att skapa ett nytt arkiv går till på ett liknande sätt: tar cyf foo.tar.bz2 fil1 fil2 fil3...katalog1 katalog2... Här är patchen: *** 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, _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': 5. Använda bzip2 med less 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: #!/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 6. Använda bzip2 med emacs 6.1. Ändra emacs för alla: Jag har skrivit följande patch till jka-compr.el, vilket lägger till bzip2 till auto-compression-mode. Tillkännagivande: 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. För att använda den, 1. Gå till katalogen med emacs-20.2/lisp-källkod (var du nu packade upp det). 2. Placera den nedanstående patchen i en fil som heter jka- compr.el.diff (den ska vara ensam i den filen ;). 3. Gör patch < jka-compr.el.diff 4. Kör igång emacs och tryck in M-x byte-compile-file jka-compr.el 5. Lämna emacs. 6. Flytta din ursprungliga jka-compr.elc till ett säkert ställe för säkerhets skull. 7. Ersätt den med den nya jka-compr.elc. 8. Ha skoj! --- 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") 6.2. Ändra emacs för en användare: 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. ;; 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) 7. Använda bzip2 med wu-ftpd 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. :.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 8. Använda bzip2 med Netscape under X tenthumbs@cybernex.net säger: 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. 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. 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 9. Använda bzip2 för att packa om andra packningsformat 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. #!/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";