11 Dateien archivieren und komprimieren
11 Dateien archivieren und komprimieren
Lernziele
-
Die Begriffe »Archivierung« und »Komprimierung« verstehen
-
Mit tar umgehen können
-
Dateien mit gzip und bzip2 komprimieren und entkomprimieren können
-
Dateien mit zip und unzip verarbeiten können
Vorkenntnisse
-
Arbeit mit der Shell (Kapitel 4)
-
Umgang mit Dateien und Verzeichnissen (Kapitel 6)
-
Umgang mit Filtern (Kapitel 8)
11.1 Archivierung und Komprimierung
„Archivierung” bezeichnet den Prozess des Zusammenfassens vieler Dateien zu einer einzigen. Die klassische Anwendung ist das Ablegen eines Verzeichnisbaums auf Magnetband. Das Magnetbandlaufwerk erscheint unter Linux als Gerätedatei, auf die die Ausgabe eines Archivierungsprogramms geschrieben werden kann. Entsprechend können Sie mit einem „Entarchivierungsprogramm” von der Gerätedatei des Bandlaufwerks lesen und diese Daten dann wieder als Verzeichnisbaum abspeichern. Da die meisten entsprechenden Programme sowohl Dateien zusammenfassen als auch Archive wieder entpacken können, fassen wir beide Vorgänge unter dem Begriff der Archivierung zusammen.
„Komprimierung” bezeichnet das Umschreiben von Daten in eine gegenüber dem Original platzsparende Fassung. Wir interessieren uns hier nur für „verlustfreie“ Komprimierung, bei der es möglich ist, aus den komprimierten Daten das Original in identischer Form wiederherzustellen.
💡 Eine Alternative besteht darin, einen höheren Komprimierungsgrad zu erreichen, indem man darauf verzichtet, das Original absolut identisch wiederherstellen zu können. Dieser „verlustbehaftete“ Ansatz wird bei Komprimierungsverfahren wie JPEG für Fotos und „MPEG-1 Audio Layer 3“ (besser bekannt als „MP3“) für Audiodaten verfolgt. Die Kunst besteht darin, unnötige Details zu verwerfen. Bei MP3 wird beispielsweise auf Basis eines psychoakustischen Modells des menschlichen Gehörs auf Teile des Signals verzichtet, die der Hörer ohnehin nicht wahrnimmt. Der Rest wird möglichst effizient kodiert. JPEG arbeitet ähnlich.
Zur Veranschaulichung könnten Sie eine Zeichenkette der Form
ABBBBAACCCCCAAAABAAAAAC
kompakter als
A4BAA5C4AB5AC
darstellen. Hierbei steht „*4B” für eine Folge von vier „B”. Dieses einfache Verfahren wird als „Lauflängenkodierung” (engl. „run-length encoding”) bezeichnet und findet sich heute noch, wenn auch in abgewandelter Form, zum Beispiel in Faxgeräten. Die „echten” Komprimierprogramme wie gzip oder bzip2 verwenden aufwendigere Methoden.
Während in der Windows-Welt Programme üblich sind, die Archivierung und Komprimierung kombinieren (PKZIP, WinZIP & Co.), werden diese beiden Schritte bei Linux und Unix üblicherweise getrennt. Eine gängige Vorgehensweise besteht darin, eine Menge von Dateien zunächst mit dem Programm tar zu archivieren und die Ausgabe von tar dann mit dem Programm gzip zu komprimieren. PKZIP & Co. komprimieren dagegen jede Datei einzeln und fassen die komprimierten Dateien dann zu einer großen zusammen.
Der Vorteil dieses Ansatzes gegenüber PKZIP und ähnlichen Programmen besteht darin, dass eine Komprimierung über mehrere Originaldateien hinweg möglich ist, wodurch sich höhere Komprimierungsraten erzielen lassen. Gleichzeitig kann dies jedoch auch ein Nachteil sein: Wenn das komprimierte Archiv beschädigt wird (etwa durch ein schadhaftes Medium oder gekippte Bits bei der Übertragung), kann es ab dieser Stelle komplett unbenutzbar werden.
💡 Selbstverständlich hindert Sie unter Linux auch niemand daran, Ihre Dateien erst zu komprimieren und sie dann zu archivieren. Das ist leider nicht so bequem wie die umgekehrte Vorgehensweise.
💡 Selbstverständlich existieren auch für Linux Implementierungen der gängigen Komprimierungs- und Archivprogramme der Windows-Welt, etwa ZIP und RAR.
Übungen
✏️ 11.1 [1] Warum wird im Beispiel für die Lauflängenkodierung AA statt *2A verwendet?
✏️ 11.2 [2] Wie würden Sie die Zeichenkette „A2B***A” mit dem skizzierten Verfahren zur Lauflängenkodierung darstellen?
11.2 Dateien archivieren mit tar
Der Name „tar” leitet sich von „tape archive” (Bandarchiv) ab. Dabei werden einzelne Dateien hintereinander in eine Archivdatei gepackt und mit Zusatzinformationen (zum Beispiel Datum, Zugriffsrechte, Eigentümer usw.) versehen. Obwohl das Programm ursprünglich für den Einsatz mit Bandlaufwerken konzipiert wurde, können Tar-Archive direkt auf die unterschiedlichsten Medien geschrieben werden. Tar-Dateien sind unter anderem der Standard für die Verbreitung von Linux-Programmquellcodes und anderer freier Software.
Die unter Linux eingesetzte Software GNU-tar bietet im Vergleich zu den tar-Implementierungen anderer Unix-Varianten zahlreiche Erweiterungen. So ist es beispielsweise möglich, Multi-Volume-Archive zu erstellen, die sich über mehrere Datenträger erstrecken. Prinzipiell sind somit sogar Sicherungskopien auf Disketten möglich, was sich allerdings nur bei kleineren Archiven lohnt.
💡 Eine kleine Anmerkung am Rande: Mit dem Kommando split können auch große Dateien wie Archive in „handliche” Teile zerlegt werden. Diese lassen sich auf Disketten kopieren oder per E-Mail verschicken und am Zielort mit cat wieder zusammenfügen.
Die Vorteile von tar sind:
- Die Anwendung ist einfach.
- Es ist zuverlässig und läuft stabil.
- Es ist universell auf allen Unix- und Linux-Systemen einsetzbar.
Nachteilig ist, dass fehlerhafte Stellen des Datenträgers zu Problemen führen können und dass Gerätedateien nicht mit jeder Version von tar archiviert werden können (was nur dann von Bedeutung ist, wenn Sie eine Komplettsicherung Ihres ganzen Systems erstellen wollen).
In Tar-Archive lassen sich sowohl einzelne Dateien als auch ganze Verzeichnisbäume einpacken. Sind in einem Netzwerk Windows-Datenträger in den Verzeichnisbaum eingehängt, können sogar diese Inhalte mit Tar gesichert werden. Die mit Tar erstellten Archive sind normalerweise nicht komprimiert, lassen sich aber zusätzlich durch gängige Kompressionsprogramme wie gzip oder bzip2 verdichten. Bei Sicherheitskopien ist dies jedoch keine gute Idee, da Bitfehler in den komprimierten Archiven in der Regel zum Verlust des gesamten Archivs führen.
Die typischen Endungen für Tar-Archive sind „tar”, „tar.bz2” oder „tar.gz”, je nachdem, ob sie gar nicht, mit Bzip2 oder mit Gzip komprimiert sind. Die Endung .tgz ist ebenfalls üblich, um gezippte Dateien im Tar-Format auch in einem DOS-Dateisystem speichern zu können. Die Syntax von tar ist:
tar ⟨Optionen⟩ ⟨Datei⟩|⟨Verzeichnis⟩ …
und die wichtigsten Optionen sind: tar-Optionen
-c erzeugt ein neues Archiv. -f ⟨Datei⟩ erzeugt oder liest das Archiv von ⟨Datei⟩. Dabei kann ⟨Datei⟩ eine Datei oder ein Gerät sein. -M bearbeitet ein tar-Archiv, das sich über mehrere Datenträger erstreckt (Multivolumen-Archiv). -r hängt Dateien an das Archiv an (nicht für Magnetbänder). -t zeigt den Inhalt des Archivs (engl. table of contents). -u ersetzt Dateien, die neuer als eine bereits archivierte Version sind. Wenn eine Datei noch nicht archiviert ist, wird sie eingefügt (nicht für Magnetbänder). -v: ausführlicher Modus (engl. verbose, geschwätzig); zeigt auf dem Bildschirm an, was gerade geschieht -x: Auslesen (engl. „extract”) der gesicherten Dateien -z komprimiert oder dekomprimiert das Archiv mit gzip. -Z komprimiert oder dekomprimiert das Archiv mit „compress” (unter Linux normalerweise nicht vorhanden). -j: komprimiert oder dekomprimiert das Archiv mit bzip2.
Die Optionssyntax von tar ist etwas ungewöhnlich, da es möglich ist, mehrere Optionen hinter einem Minuszeichen zu bündeln. Ausgefallenerweise ist dies auch bei Optionen wie -f möglich, die einen Parameter nach sich ziehen. Die Parameter müssen hinter dem „Bündel” angegeben werden und werden der Reihe nach den entsprechenden Optionen im Bündel zugeordnet.
💡 Sie können das Minuszeichen vor dem ersten „Optionsbündel” auch weglassen. Oft werden Sie Kommandos wie
tar cvf
Wir empfehlen Ihnen das jedoch nicht.
Das folgende Beispiel archiviert alle Dateien im aktuellen Verzeichnis, deren Name mit „data” beginnt, in die Archivdatei „data.tar” im Heimatverzeichnis des Benutzers:
$ tar -cvf ~/data.tar data*
data1 data10 data2 data3
✁✁✁✁✁
Das Argument -c gibt an, dass das Archiv neu erzeugt werden soll. Das Argument -f ~/data.tar gibt den Namen an, unter dem das Archiv angelegt werden soll. Die Option -v ändert am Ergebnis nichts. Sie bewirkt lediglich, dass der Anwender eine Übersicht über den Ablauf auf dem Bildschirm erhält. Sollte eine der zu archivierenden Dateien ein Verzeichnis sein, wird außer dem Verzeichnis selbst auch der komplette Verzeichnisinhalt erfasst.
Mit dem Programm „tar” können auch ganze Verzeichnisse archiviert werden. Es ist besser, dies vom übergeordneten Verzeichnis aus durchzuführen. Dadurch werden die zu archivierenden Dateien gleich in einem Verzeichnis abgelegt und auch wieder als Verzeichnis extrahiert. Das folgende Beispiel erklärt das genauer.
# cd /
# tar -cvf /tmp/home.tar /home
Der Systemadministrator „root” legt ein Archiv des Verzeichnisses „/home” (also aller Benutzerdaten) unter dem Namen „home.tar” an. Dieses wird im Verzeichnis /tmp abgespeichert.
💡 Wenn Dateien oder Verzeichnisse mit absoluten Pfadnamen angegeben werden, sichert Tar diese automatisch als relative Pfadnamen (mit anderen Worten: Der „/” am Anfang wird entfernt). Dadurch werden Probleme beim Auspacken auf anderen Rechnern vermieden (siehe Übung 11.6). Das „Inhaltsverzeichnis” eines Archivs können Sie mit der Option -t anzeigen.
$ tar -tf data.tar
data1 data10 data2
✁✁✁✁✁
Mit der Option -v ist tar etwas mitteilsamer:
$ tar -tvf data.tar
-rw-r--r-hugo/hugo 7 2009-01-27 12:04 data1
-rw-r--r-hugo/hugo 8 2009-01-27 12:04 data10
-rw-r--r-hugo/hugo 7 2009-01-27 12:04 data2
✁✁✁✁✁
Auspacken können Sie die Daten mit der Option -x:
$ tar -xf data.tar
Hierbei wird überhaupt keine Ausgabe auf dem Terminal produziert. Um eine Ausgabe zu erhalten, müssen Sie erneut die Option -v angeben.
$ tar -xvf data.tar
data1 data10 data2
✁✁✁✁✁
💡 Enthält das Archiv eine Verzeichnishierarchie, wird diese im aktuellen Verzeichnis originalgetreu wieder aufgebaut. (Sie erinnern sich: tar macht automatisch aus allen absoluten Pfadnamen relative.) Sie können das Archiv relativ zu jedem beliebigen Verzeichnis auspacken – es behält dabei immer seine Struktur.
Sie können beim Auspacken auch Datei- oder Verzeichnisnamen angeben. In diesem Fall werden nur die betreffenden Dateien oder Verzeichnisse ausgepackt. Allerdings müssen Sie darauf achten, die Schreibweise der betreffenden Namen im Archiv genau zu treffen.
$ tar -cf data.tar /data
$ tar -tvf data.tar
drwxr-xr-x hugo/hugo 0 2009-01-27 12:04 /data/
-rw-r--r-hugo/hugo 7 2009-01-27 12:04 /data/data2
✁✁✁✁✁
$ mkdir data-neu
$ cd data-neu
$ tar -xvf ./data.tar data/data2 / fehlt
tar: data/data2: Not found in archive
tar: Error exit delayed from previous errors
Übungen
✏️ 11.3 [!2] Legen Sie das Inhaltsverzeichnis Ihres Heimatverzeichnisses in einer Datei namens „inhalt” ab. Erzeugen Sie aus dieser Datei ein Tar-Archiv. Betrachten Sie anschließend die Ursprungsdatei und das Archiv. Was fällt Ihnen auf?
✏️ 11.4 [2] Erstellen Sie drei bis vier leere Dateien und fügen Sie diese dem gerade erzeugten Archiv hinzu.
✏️ 11.5 [2] Löschen Sie zunächst die Originaldateien und entpacken Sie anschließend den Inhalt des Tar-Archivs.
✏️ 11.6 [2] Warum entfernt GNU tar prophylaktisch das / am Anfang des Pfadnamens, wenn der Name einer zu archivierenden Datei oder eines Verzeichnisses als absoluter Pfadname angegeben wurde? (Tipp: Betrachten Sie das Kommando
# tar -cvf /tmp/etc-backup.tar /etc
und überlegen Sie, was passiert, wenn etc-backup.tar (a) absolute Pfadnamen enthält und (b) auf einen anderen Rechner übertragen und dort ausgepackt wird.)
11.3 Dateien komprimieren mit gzip
Das gängigste Komprimierungsprogramm für Linux ist gzip von Jean-Loup Gailly und Mark Adler. Es dient dazu, einzelne Dateien zu komprimieren, die wiederum Archive sein können, die viele Dateien enthalten.
💡 Das Programm gzip (kurz für „GNU zip”) wurde 1992 veröffentlicht, um Probleme mit dem Programm compress zu vermeiden, das bei proprietären Unix-Versionen Standard war. Compress basiert auf dem Lempel-Ziv-Welch-Algorithmus (LZW), der in den USA unter der Nummer 4,558,302 patentiert war. Das Patent gehörte der Firma Sperry (später Unisys) und lief am 20. Juni 2003 ab. gzip verwendet dagegen das DEFLATE-Verfahren von Phil Katz [RFC195], das auf einem nicht patentierten Vorläufer von LZW namens LZ77 nebst dem Huffman-Kodierungsverfahren aufbaut und von Patentansprüchen frei ist. Außerdem ist es effektiver als LZW.
💡 Die Grundidee hinter Verfahren wie LZ77 ist, dass versucht wird, Muster in der Eingabe zu erkennen, und statt des kompletten Musters nur der Name des Musters vermerkt wird. Die komprimierte Datei besteht dann im Wesentlichen aus einem Verzeichnis der erkannten Muster und einer Liste der erkannten Muster in ihrer tatsächlichen Abfolge. In dem Moment, in dem möglichst lange Muster möglichst oft auftreten, ist die Komprimierung am erfolgreichsten. Entscheidend für die Laufzeit und den Speicherverbrauch beim Komprimieren ist, wie viel Mühe man sich bei der Suche nach Mustern gibt und wie viel Platz man für das Musterverzeichnis einplant – ein großes Musterverzeichnis verbessert potenziell die Komprimierung, muss aber natürlich auch effizient durchsucht werden können.nen.
💡 gzip kann mit dem Programm „compress” komprimierte Dateien entpacken, da das Unisys-Patent nur das Komprimieren abdeckte. Solche Dateien erkennen Sie an der Endung „.Z” ihrer Dateinamen.
💡 gzip ist nicht zu verwechseln mit PKZIP und ähnlichen Programmen für Windows mit „ZIP” im Namen. Diese Programme können Dateien komprimieren und anschließend archivieren. gzip hingegen kümmert sich nur um die Komprimierung und überlässt das Archivieren Programmen wie tar oder cpio. gzip kann ZIP-Archive auspacken, sofern das Archiv genau eine Datei enthält, die mit dem DEFLATE-Verfahren komprimiert wurde.
gzip bearbeitet und ersetzt einzelne Dateien, wobei jeweils die Endung „.gz” an den Dateinamen angehängt wird. Diese Substitution erfolgt unabhängig davon, ob die resultierende Datei tatsächlich kleiner als die ursprüngliche ist. Sollen mehrere Dateien komprimiert in einem einzigen Archiv gespeichert werden, müssen die Programme tar und gzip kombiniert werden.
Die wichtigsten Optionen von gzip sind:
-
-c Schreibt die komprimierte Datei auf die Standardausgabe, anstatt die Datei zu ersetzen. Dadurch bleibt die Originaldatei erhalten.
-
-d Die Datei wird dekomprimiert (alternativ: gunzip arbeitet wie gzip -d).
-
-l Er zeigt (engl. list) wichtige Verwaltungsinformationen der komprimierten Datei wie den Dateinamen, die ursprüngliche und die gepackte Größe an.
-
-r Es packt auch Dateien in darunterliegenden Verzeichnissen (engl. recursive).
-
-S ⟨Suffix⟩ Verwende anstelle von „gz” die angegebene Endung.
-
-v Er gibt den Namen und den Kompressionsfaktor für jede Datei aus.
-
-1 … -9 Es wird ein Kompressionsfaktor angegeben. Die Option -1 (oder --fast) arbeitet am schnellsten, komprimiert aber nicht so gründlich. Die Option -9 (oder --best) liefert die beste Komprimierung, allerdings ist die Laufzeit höher. Voreingestellt ist die Option -6.
Mit dem folgenden Befehl wird die Datei brief.tex komprimiert, die komprimierte Datei unter brief.tex.gz gespeichert und die Originaldatei gelöscht:
$ gzip brief.tex
Entpackt wird mit:
$ gzip -d brief.tex
oder
$ gunzip brief.tex
Hier wird die komprimierte Datei unter brief.tex.t statt unter brief.tex.gz gespeichert (-S t) und der erreichte Kompressionsfaktor wird ausgegeben (-v).
$ gzip -vS t brief.tex
Entsprechend muss beim Entpacken auch wieder die Option -S angegeben werden, da gzip -d eine Datei mit der Endung gz erwartet.
$ gzip -dS t brief.tex
Wenn alle Dateien mit der Endung „tex” in einer Datei namens „tex-all.tar.gz” komprimiert werden sollen, dann sieht das so aus:
# tar -cvzf tex-all.tar.gz *.tex
Bitte beachten Sie, dass tar die Originaldateien nicht löscht! Zum Entpacken verwenden Sie bitte:
# tar -xvzf tex-all.tar.gz
Übungen
✏️ 11.7 [2] Komprimieren Sie das Tar-Archiv aus Übung 11.5 mit maximaler Verkleinerung.
✏️ 11.8 [!3] Sehen Sie sich den Inhalt des komprimierten Archivs an. Stellen Sie anschließend das ursprüngliche tar-Archiv wieder her.
✏️ 11.9 [!2] Wie gehen Sie vor, um den gesamten Inhalt Ihres Heimatverzeichnisses in eine mit gzip komprimierte Datei zu packen?
11.4 Dateien komprimieren mit bzip2
bzip2 von Julian Seward ist ein Komprimierungsprogramm, das weitgehend mit gzip kompatibel ist. Es verwendet jedoch ein anderes Verfahren, das zu einer höheren Komprimierung führt, aber auch mehr Zeit und Speicherplatz zum Komprimieren benötigt (beim Entkomprimieren ist der Unterschied nicht so groß).
💡 Wenn Sie es genau wissen wollen: bzip2 verwendet eine „Burrows-Wheeler-Transformation“, um häufig auftretende Teilzeichenketten in der Eingabe in Folgen einzelner Zeichen umzuwandeln. Das Zwischenergebnis wird anhand der „lokalen Häufigkeit” der einzelnen Zeichen nochmals umsortiert und das Resultat dieser Sortierung wird nach einer Lauflängenkodierung schließlich mit dem Huffman-Verfahren kodiert. Der Huffman-Code wird schließlich besonders platzsparend in eine Datei geschrieben.
💡 Was ist mit bzip? bzip war ein Vorläufer von bzip2, der nach der Blocktransformation statt der Huffman-Kodierung eine arithmetische Kodierung einsetzte. Da es rund um die arithmetische Kodierung aber jede Menge Softwarepatente gibt, nahm man von diesem Verfahren wieder Abstand.
Wie gzip akzeptiert auch bzip2 einen oder mehrere Dateinamen als Parameter zur Komprimierung. Die Dateien werden jeweils durch die komprimierte Version mit der Endung .bz2 ersetzt.
Die Optionen -c und -d entsprechen den gleichnamigen Optionen von gzip. Die »Qualitätsoptionen« -1 bis -9 verhalten sich allerdings anders: Sie bestimmen die Blockgröße, mit der bzip2 bei der Komprimierung arbeitet. Der Standardwert ist -9. -1 bietet dagegen keinen signifikanten Geschwindigkeitsvorteil.
💡 -9 verwendet eine Blockgröße von 900 KiB. Dies entspricht einem Speicherplatzverbrauch von etwa 3,7 MiB zum Entkomprimieren (7,6 MiB zum Komprimieren). Auf heutigen Rechnern dürfte dies jedoch kein Hinderungsgrund mehr sein. Eine weitere Erhöhung der Blockgröße bringt keinen merklichen Vorteil mehr. Es ist hervorhebenswert, dass die Wahl der Blockgröße bei der Komprimierung über den Speicherplatzbedarf bei der Entkomprimierung entscheidet. Dies sollten Sie bedenken, wenn Sie auf Ihrem Multi-Gibibyte-PC bz2-Dateien für Rechner mit extrem wenig Speicher (Toaster, Set-Top-Boxen usw.) erstellen. bzip2(1) erklärt dies detaillierter.
In Analogie zu gzip und gunzip dient bunzip2 zum Entkomprimieren von mit bzip2 komprimierten Dateien. (Eigentlich ist das nur ein anderer Name für das bzip2-Programm. Sie können auch „bzip2 -d” verwenden, um Dateien zu entkomprimieren.)
11.5 Dateien komprimieren mit xz
Allen, denen die Möglichkeiten von gzip und bzip2 nicht ausreichen, steht neuerdings auch das Programm xz zur Verfügung.
xz ist erstmals in der Version 4.0 der LPI-Prüfung 101 enthalten. Warum es nötig ist, in der Prüfung ein weiteres Programm zu haben, das sich nicht substanziell von den anderen unterscheidet, ist fraglich.
xz bietet eine noch bessere Komprimierung als bzip2, allerdings müssen Sie dafür längere Komprimierungszeiten in Kauf nehmen (die Entkomprimierung ist vergleichbar schnell). Damit eignet sich xz vor allem für die Software-Verteilung, bei der Quellcodes oder Binärpakete typischerweise einmal zusammengepackt, aber oft übers Internet übertragen und wieder ausgepackt werden.
💡 Seit 2014 steht der Linux-Quellcode in einer xz-komprimierten Version zur Verfügung. Auch viele Distributionen verwenden xz bei der Erstellung von Softwarepaketen, zum Beispiel Debian, Fedora, openSUSE oder Arch Linux.
💡 xz verwendet das LZMA-Verfahren von Igor Pavlov, dem Autor des Komprimierungsprogramms. „LZMA” steht für „Lempel-Ziv-Markov”.
Wie gzip basiert LZMA ursprünglich auf dem LZ77-Verfahren und verwendet somit ein Musterverzeichnis. Der Unterschied zu anderen Nachfahren wie DEFLATE und LZMA besteht darin, dass die Ausgabe des verzeichnisorientierten Algorithmus bei LZMA noch einmal mithilfe eines komplexen probabilistischen Modells kodiert wird (das „M” steht hier für „Markov”).
💡 Tatsächlich benutzt xz das „LZMA2“-Verfahren, was nichts anderes bedeutet, als dass für Teile der Eingabe entschieden wird, ob die LZMA-komprimierte Fassung oder die ursprüngliche, unkomprimierte Fassung kürzer ist. In die Ausgabe wird jeweils die kürzere Fassung geschrieben. Manche Datenformate (etwa JFIF, vulgo „JPEG“, oder MP3) sind nämlich bereits so gut komprimiert, dass die Ausgabe fast wie zufällig ausgewürfelte Bits aussieht und sich mit einem allgemein anwendbaren Programm wie xz kaum verbessern lässt. Bevor xz also das Ganze verschlimmbessert, lässt es die Daten lieber (aus seiner Sicht) „unkomprimiert“.
In seinen Grundzügen unterscheidet sich xz in der Bedienung nicht von gzip und bzip2. Genau wie bei den anderen Programmen gibt es das Kommando xz zum Komprimieren und das Kommando unxz zum Entkomprimieren1, aber xz -d entkomprimiert auch.
Wie bei gzip und bzip2 ist der Effizienzparameter -1 … -9 entscheidend für die Leistung des Programms. Wie bei den beiden anderen Programmen bedeuten größere Zahlen prinzipiell eine bessere Komprimierung. Die Standardvoreinstellung -6 ist für die meisten Anwendungen brauchbar und benötigt 94 MiB virtuellen Speicher zum Komprimieren. Die Größe des Musterverzeichnisses beträgt dabei 8 MiB. Zum Vergleich: Mit der Option -9 werden zum Komprimieren ungefähr 675 MiB virtueller Speicher benötigt und das Musterverzeichnis ist 64 MiB groß. (Eine genaue Tabelle steht in xz(1).)
💡 Es bringt nichts, ein Musterverzeichnis zu verwenden, das größer ist als die zu komprimierende Datei. Die Optionen ab -7 (mit einem Musterverzeichnis von 16 MiB) lohnen sich also nur, wenn die Eingabe ziemlich groß ist.
💡 Zum Entkomprimieren benötigt xz etwa einen Zehntel des zum Komprimieren benötigten Speichers. Das heißt, mit der Option „-9” beim Komprimieren sind zum Entkomprimieren rund 65 MiB Hauptspeicher erforderlich. Auf älteren Systemen oder Raspberry Pis kann das störend werden.
Sie sollten jedenfalls nicht wie bei gzip und bzip2 blindlings die Option -9 für alles benutzen.
💡 Die Option -e (wie „extrem”) macht die Komprimierung langsamer und vielleicht noch ein bisschen besser – oder auch nicht. Sie müssen selbst ausprobieren, ob das für Ihre Anwendung etwas bringt.
Die Option -q unterdrückt routinemäßige Meldungen und Warnungen. (-qq unterdrückt sogar Fehlermeldungen, sodass Sie den Rückgabewert des Programms überprüfen müssen, um festzustellen, ob alles geklappt hat.) Mit der Option -v erhalten Sie eine Fortschrittsausgabe.
💡 Sie können auch erreichen, dass tar seine Ausgabe direkt mit xz komprimiert. Die dafür nötige Option ist -J.
Übungen
✏️ 11.10 [3] Besorgen Sie sich eine geeignete Datei, beispielsweise ein größeres Tar-Archiv mit Quellcode für den Linux-Kernel, und komprimieren Sie diese jeweils mit Gzip, Bzip2 und Xz. Messen Sie dabei die Ausführungszeit mit dem Befehl time. Wie verhalten sich die Laufzeiten und die Komprimierungsraten zueinander?
✏️ 11.11 [2] Experimentieren Sie mit der Datei aus der vorherigen Aufgabe und vergleichen Sie die Laufzeit sowie die Größe des Ergebnisses für xz mit verschiedenen Effizienzoptionen. Was ist der Unterschied zwischen den Optionen -1 und -6 sowie zwischen den Optionen -6 und -9?
11.6 Dateien archivieren und komprimieren mit zip- und unzip
Für den Datenaustausch mit Windows-Rechnern oder im Internet ist es mitunter nützlich, das weit verbreitete ZIP-Dateiformat zu verwenden. Die gängigen Dateiarchivprogramme unter Windows kommen heutzutage allerdings auch mit dem Format tar.gz zurecht. Unter Linux gibt es die Programme „zip” (zum Erstellen von Archiven) und „unzip” (zum Auspacken von Archiven).
💡 Je nach Distribution müssen Sie diese Programme möglicherweise separat installieren. Bei Debian GNU/Linux gibt es beispielsweise zwei separate Pakete: zip und unzip.
Das Programm „zip” kombiniert Archivieren und Komprimieren, so wie Sie es vielleicht von Programmen wie PKZIP kennen. Im einfachsten Fall fasst es die auf der Kommandozeile aufgezählten Dateien zusammen.
$ zip test.zip file1 file2 adding: file1 (deflated 66%) adding: file2 (deflated 62%)
$ _
(Dabei ist test.zip der Name des resultierenden Archivs.)
Mit der Option -r können Sie zip sagen, dass es rekursiv in Verzeichnisse absteigen soll:
$ zip -r test.zip ziptest
adding: ziptest/ (stored 0%)
adding: ziptest/testfile (deflated 62%) adding: ziptest/file2 (deflated 62%) adding: ziptest/file1 (deflated 66%)
Mit der Option -@ liest Zip die Namen der zu archivierenden Dateien von der Kommandozeile:
$ find ziptest | zip -@ test
adding: ziptest/ (stored 0%)
adding: ziptest/testfile (deflated 62%) adding: ziptest/file2 (deflated 62%) adding: ziptest/file1 (deflated 66%)
(Die ZIP-Endung des Archivs dürfen Sie weglassen.)
💡 zip kennt zwei Methoden, um Dateien in ein Archiv zu packen: „stored” bedeutet, dass die Datei ohne Komprimierung gespeichert wurde, während „deflated” für Komprimierung steht. Die Prozentzahl gibt an, um wie viel die Datei verkleinert wurde („deflated 62 %” bedeutet also, dass die Datei im Archiv nur 38 % der Originalgröße einnimmt). Zip wählt automatisch die sinnvollere Methode, sofern Sie die Komprimierung nicht mit der Option „-0” komplett abschalten.
Wenn Sie zip mit einem existierenden ZIP-Archiv als erstem Parameter aufrufen und keine weiteren Angaben machen, werden die zu archivierenden Dateien zusätzlich zum bisherigen Inhalt dem Archiv hinzugefügt (namensgleiche, bereits im Archiv vorhandene Dateien werden dabei überschrieben). zip benimmt sich damit anders als das weiter oben besprochene Programm tar. Wenn Sie ein „sauberes” Archiv wollen, müssen Sie die Datei vorher löschen.
Außer dem dumpfen Hinzufügen kennt zip noch einige andere Betriebsarten: Die Option -u (update) aktualisiert das Archiv, indem nur die im Archiv vorhandenen Dateien von den auf der Kommandozeile angegebenen Dateien überschrieben werden, sofern die auf der Kommandozeile angegebenen Dateien neuer sind als die im Archiv vorhandenen Dateien. Auf der Kommandozeile benannte Dateien, die noch nicht im Archiv stehen, werden auf jeden Fall aufgenommen. Mit der Option -f (freshen) können Sie Dateien im Archiv durch neuere Versionen von der Kommandozeile überschreiben. Es werden jedoch keine Dateien ins Archiv geschrieben, die nicht bereits zuvor darin enthalten waren. Mit der Option -d (delete) werden die auf der Kommandozeile angegebenen Dateinamen als Namen von Dateien im Archiv interpretiert und diese werden gelöscht.
💡 Neuere Versionen von zip unterstützen außerdem den -FS-Modus (Filesystem Sync). Dieser synchronisiert ein Archiv mit dem Dateisystem, indem er im Wesentlichen dasselbe macht wie der Parameter -u, aber zusätzlich Dateien aus dem Archiv löscht, die nicht auf der Kommandozeile benannt wurden (oder, im Falle von -r, in einem durchsuchten Verzeichnis stehen). Der Vorteil dieser Methode gegenüber einem kompletten Neuaufbau des Archivs besteht darin, dass bereits im Archiv vorhandene und unveränderte Dateien nicht neu komprimiert werden müssen.
zip kennt viele Optionen, die Sie sich mit „zip -h” oder (ausführlicher) mit „zip -h2” anschauen können. Auch die Manpage zip(1) hat einiges zu sagen.
Ein ZIP-Archiv können Sie mit unzip wieder auspacken (es darf sich dabei auch um ein ZIP-Archiv von einem Windows-Rechner handeln). Sinnvollerweise werfen Sie mit der Option -v zuerst einen Blick in das Archiv, um zu schauen, was darin enthalten ist – das erspart Ihnen möglicherweise unangenehme Überraschungen mit Unterverzeichnissen (oder deren Abwesenheit).
$ unzip -v test Endung zip darf wegfallen
Archive: test.zip
Length Method Size Cmpr Date Time CRC-32 Name
---------------------------------------------
0 Stored 0 0% 2012-02-29 09:29 00000000 ziptest/
16163 Defl:N 6191 62% 2012-02-29 09:46 0d9df6ad ziptest/testfile
18092 Defl:N 6811 62% 2012-02-29 09:01 4e46f4a1 ziptest/file2
35147 Defl:N 12119 66% 2012-02-29 09:01 6677f57c ziptest/file1
------- -------- -------
69402 25121 64% 4 files
Zum Auspacken genügt es, wenn Sie „unzip” mit dem Namen des Archivs als einzigen Parameter aufrufen:
$ mv ziptest ziptest.orig
$ unzip test
Archive: test.zip creating: ziptest/
inflating: ziptest/testfile inflating: ziptest/file2 inflating: ziptest/file1
Mit der Option -d können Sie das Archiv in einem anderen Verzeichnis als dem aktuellen auspacken. Falls nötig, wird dieses Verzeichnis zuerst angelegt:
$ unzip -d dir test
Archive: test.zip creating: dir/ziptest/
inflating: dir/ziptest/testfile inflating: dir/ziptest/file2 inflating: dir/ziptest/file1
Wenn Sie auf der Kommandozeile bestimmte Dateien benennen, werden nur diese ausgepackt:
$ rm -rf ziptest
$ unzip test ziptest/file1
Archive: test.zip inflating: ziptest/file1
(Das Verzeichnis „ziptest” wird in diesem Beispiel trotzdem angelegt.)
💡 Alternativ können Sie mit der Option „-x” bestimmte Dateien gezielt vom Auspacken ausschließen.
$ rm -rf ziptest
$ unzip test -x ziptest/file1
Archive: test.zip creating: ziptest/
inflating: ziptest/testfile inflating: ziptest/file2
Sie können auch Shell-Suchmuster verwenden, um bestimmte Dateien auszupacken oder auszuschließen:
$ rm -rf ziptest
$ unzip test ""ziptest/f*""
Archive: test.zip inflating: ziptest/file2 inflating: ziptest/file1
$ rm -rf ziptest
$ unzip test -x ""*/t*""
Archive: test.zip
creating: ziptest/ inflating: ziptest/file2 inflating: ziptest/file1
(Achten Sie auf die Anführungszeichen, die die Suchmuster vor der tatsächlichen Shell verbergen, damit unzip sie sehen kann.) Im Gegensatz zur Shell beziehen sich die Suchmuster auf den kompletten Dateinamen (inklusive eventueller „/”).
Wie nicht anders zu erwarten, können Sie auch bei unzip eine Vielzahl weiterer Optionen angeben. Lassen Sie sich mit „unzip -h” oder „unzip -hh” die programminterne Hilfe anzeigen oder lesen Sie „unzip(1)”.
Übungen
✏️ 11.12 [!2] Legen Sie einige Dateien in Ihrem Heimatverzeichnis an und verpacken Sie diese in einem ZIP-Archiv. Betrachten Sie anschließend den Inhalt des Archivs mit dem Befehl „unzip -v“. Entpacken Sie das Archiv anschließend im Verzeichnis /tmp.
✏️ 11.13 [!1] Was passiert, wenn Sie eine Datei mit unzip auspacken wollen, die bereits im Dateisystem existiert?
✏️ 11.14 [2] Das ZIP-Archiv „files.zip“ enthält zwei Unterverzeichnisse „a“ und „b“, in denen sich eine Mischung von Dateien mit verschiedenen Endungen (zum Beispiel „.c“, „.txt“ und „.dat“) befindet. Geben Sie ein Unzip-Kommando ein, mit dem Sie in einem Schritt den kompletten Inhalt von A bis auf die TXT-Dateien extrahieren können.
11.7 Kommandos in diesem Kapitel
| Kommando | Beschreibung | manpage |
|---|---|---|
| bunzip2 | Entkomprimierungsprogramm für bz2-Dateien" | bzip2(1) |
| bzip2 | Komprimierungsprogramm | bzip2(1) |
| gunzip | Entkomprimierungsprogramm für gz-Dateien | gzip(1) |
| split | Teilt Dateien in Stücke bis zu einer gegebenen Größe auf | split(1) |
| tar | Dateiarchivierungsprogramm | tar(1) |
| unzip | Entkomprimierungsprogramm für (Windows-)ZIP-Archive | unzip(1) |
| zip | Archivierungs- und Komprimierungsprogramm à la PKZIP | zip(1) |
11.8 Zusammenfassung
-
Bei der „Archivierung” werden viele Dateien zu einer großen zusammengefasst. Bei der „Komprimierung” wird eine Datei umkehrbar in eine kompaktere Form gebracht.
-
tar ist das gängigste Archivprogramm unter Linux.
-
gzip ist ein Programm, das beliebige Dateien komprimiert und dekomprimiert. Es kann zusammen mit tar benutzt werden.
-
bzip2 ist ein weiteres Kompressionsprogramm. Es kann höhere Kompressionsraten erzeugen als gzip, benötigt dafür jedoch mehr Zeit und Speicherplatz.
-
Ein weiteres Komprimierungsprogramm, das noch besser komprimiert, aber auch noch mehr Zeit und Speicherplatz benötigt, ist xz.
-
Die Programme „zip” und „unzip” erlauben die Verarbeitung von ZIP-Archiven, wie sie zum Beispiel von PKZIP unter Windows angelegt und gelesen werden können.
11.9 Literaturverzeichnis
RFC1951 P. Deutsch. »DEFLATE Compressed Data Format Specification version 1.3«, Mai 1996. http://www.ietf.org/rfc/rfc1951.txt
-
Von der eigentlich naheliegenden Idee, das Entkomprimierungsprogramm „xunz” zu nennen, hat der Autor anscheinend Abstand genommen – ist vielleicht auch besser so. ↩