gzip, bzip2 und tar

Aus LinuxUser 10/2005

gzip, bzip2 und tar

Verpackungskünstler

Archivierungsprogramme gibt es wie Sand am Meer; die schnellsten Vertreter ihrer Art nutzen Sie auf der Kommandozeile: Mit kurzen Befehlen packen Sie Ihre Daten zusammen und wieder aus oder archivieren ganze Verzeichnishierarchien.

Zu Befehl

Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder Gnome regeln lassen – wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, in denen es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.

Gründe zum Archivieren gibt es immer: Zusammengepackte und komprimierte Daten sparen Plattenplatz und Bandbreite beim Versand über das Internet. Unter Linux gibt es sowohl grafische Tools, wie zum Beispiel File Roller oder Ark (Abbildung 1), als auch Kommandozeilenprogramme, welche die verschiedenen Kompressions- und Archivtypen erzeugen und entpacken. Dieser Artikel stellt Shell-Tools vor und zeigt, wie Sie durch geschickte Kombination der Befehle zum Verpackungskünstler werden.

Abbildung 1: Ark erstellt (komprimierte) Archive Ihrer Daten und packt sie wieder aus – alles per Mausklick.

Abbildung 1: Ark erstellt (komprimierte) Archive Ihrer Daten und packt sie wieder aus – alles per Mausklick.

Gut verpackt mit “gzip”

Das Programm Gzip (GNU Zip) ist der “Standardpacker” unter Linux. Gzip komprimiert einfache Dateien; Archive ganzer Verzeichnisse legt das Tool allerdings nicht an. Der einfachste Aufruf lautet:

gzip datei

Gzip ersetzt die Originaldatei durch eine komprimierte Fassung mit der zusätzlichen Dateiendung .gz. Dateieigenschaften wie Rechte, Zugriffs- und Modifikationszeit bleiben beim Packen erhalten. Gefällt Ihnen die Dateiendung nicht, definieren Sie über -S (Suffix) eine eigene. So erzeugt der Aufruf

gzip -S .z bild.bmp

eine komprimierte Datei namens bild.bmp.z.

Die Größe der zurechtgestutzten Datei hängt unter anderem von der Verteilung gemeinsamer Zeichenketten in der Originaldatei ab. Das bedeutet, dass Gzip Dateien, in denen sich ähnliche Muster wiederholen, deutlich besser “zusammenschrumpft”. Bereits komprimierte Dateien, etwa im MP3- oder JPEG-Format, verkleinert Gzip dagegen nicht besonders gut. Listing 1 zeigt die Unterschiede für eine Bitmap- und eine JPEG-Datei.

Weiterhin beeinflussen Sie die Größe über einen Kompressionsfaktor zwischen 1 und 9, wobei gzip -1 schneller komprimiert und gzip -9 langsamer, aber mit besserer Kompressionsrate arbeitet. Als Standard ist -6 definiert; um diese Vorgabe zu ändern, setzen Sie die Umgebungsvariable GZIP in der Datei ~/.bashrc, zum Beispiel

export GZIP="-9"

Listing 1

Komprimierung im Vergleich

$ ls -l
-rw-r--r--  1 huhn huhn 2313894 Sep  3 22:47 screenie.bmp
-rw-r--r--  1 huhn huhn  169862 Sep  5 12:41 screenie.jpg
$ gzip screenie*
$ ls -l
-rw-r--r--  1 huhn huhn    9547 Sep  3 22:47 screenie.bmp.gz
-rw-r--r--  1 huhn huhn  130524 Sep  5 12:41 screenie.jpg.gz

Eine mit Gzip komprimierte Datei entpacken Sie entweder mit Gunzip oder gzip -d. Liegt im Verzeichnis eine Datei mit gleichem Namen, fragt das Programm sicherheitshalber nach, ob Sie diese überschreiben wollen:

$ gunzip screenie.jpg.gz
gunzip: screenie.jpg already exists; do you wish to overwrite (y or n)?

Antworten Sie an dieser Stelle mit [N], bricht Gzip die Operation ab. Wenn Sie die Sicherheitsabfrage als störend empfinden, schalten Sie über die Option -f ab (englisch “force” = “erzwingen”). Der Parameter hat noch eine Nebenwirkung: Standardmäßig weigert Gzip sich, einen Symlink zu komprimieren. Lassen Sie Gzip zusammen mit dem Parameter -f auf solche Verweise los, komprimiert das Tool die Datei, auf die der symbolische Link zeigt, und gibt ihr den Namen des Symlinks (ergänzt um die Endung). Beim Entpacken landet anschließend allerdings kein Verweis, sondern eine Datei auf der Platte (Abbildung 2).

Abbildung 2: Aufgepasst beim Komprimieren von Symlinks: Der Parameter "-f" erzwingt dies, das Auspacken erzeugt allerdings keinen Verweis mehr.

Abbildung 2: Aufgepasst beim Komprimieren von Symlinks: Der Parameter “-f” erzwingt dies, das Auspacken erzeugt allerdings keinen Verweis mehr.

Komprimierte Textdateien, wie zum Beispiel die HOWTOs unter /usr/share/doc/, müssen Sie nicht erst umständlich auspacken und dann mit einem Pager wie Less oder More anzeigen. Schneller geht es, wenn Sie Gzip mit dem Parameter -c (schreibt nach stdout) einsetzen und die Ausgabe über eine Pipe an einen Betrachter weiterleiten, z. B.:

gzip -dc /usr/share/doc/iptables/README.Debian.gz | less

Noch kürzer geht es mit zless Datei.gz: Hinter dem Befehl steckt ein kleines Skript, das im Wesentlichen das Gleiche leistet.

Neuer, schneller, besser: “bzip2”

Das Programm Bzip2 verwendet einen anderen Kompressionsalgorithmus und verkleinert daher die meisten Dateien deutlich besser. Listing 2 zeigt Gzip und Bzip2 im Vergleich. Weiterhin besitzt Bzip2 einen so genannten Recovery-Modus: Beim Komprimieren zerlegt das Tool die Dateien in einzelne Blöcke. Ist eine Datei beschädigt, ist es eventuell noch möglich, Daten aus den intakt gebliebenen Bereichen zu retten – dazu entpacken Sie mit Bzip2recover die unbeschädigten Teile.

Listing 2

“gzip” und “bzip2” im Vergleich

$ ls -l bild.bmp*
-rw-r--r--  1 huhn huhn 2313894 Sep  5 13:35 bild.bmp
-rw-r--r--  1 huhn huhn    2534 Sep  5 13:35 bild.bmp.bz2
-rw-r--r--  1 huhn huhn    9547 Sep  5 13:35 bild.bmp.gz

Abgesehen von einigen kleinen Unterschieden ähneln viele Bzip2-Optionen denen von Gzip. Auch hier geben Sie zum einfachen Komprimieren einer Datei nur deren Namen an:

bzip2 datei

Die komprimierte Datei trägt anschließend die Endung .bz2 und behält – genauso wie beim Packen mit Gzip – ihre ursprünglichen Dateieigenschaften. Anders als Gzip kennt Bzip2 eine Option, über die es eine Kopie des Originals anlegt. Geben Sie dafür einfach zusätzlich den Parameter -k (englisch “keep” = “behalten”) an:

bzip2 -k datei

(Wer Gleiches mit Gzip erreichen will, gibt die komprimierte Datei auf die Standardausgabe aus und schreibt sie dann in eine neue Datei: gzip -c datei > datei.gz. Die komprimierte Fassung übernimmt auf diese Weise allerdings nicht die Dateieigenschaften.)

Wie bei Gzip bringen die Parameter -1 bis -9 (Standard) Bzip2 dazu, mehr oder weniger stark zu komprimieren. Um die Vorgabe zu ändern, setzen Sie die Umgebungsvariable GZIP. Fügen Sie beispielsweise in die Datei ~/.bashrc die Zeile

export BZIP2="-6"

ein. Zum Entpacken geben Sie entweder Bzip2 die Option -d mit auf den Weg oder verwenden den speziellen Entpackbefehl Bunzip2. Genau wie Gzip schützt das Programm vor dem Überschreiben vorhandener Dateien. Anders als bei Gzip überlässt das Tool Ihnen aber nicht die Entscheidung und fragt nach, sondern bricht einfach den Vorgang ab:

$ bunzip2 peggy.jpg.bz2
bunzip2: Output file peggy.jpg already exists.

Der Parameter -f schaltet dieses Verhalten ab.

Ab ins Archiv

Um mehrere Dateien in einem Archiv zusammenzufassen, verwenden Sie den Befehl Tar. Der Name des Programms (englisch “tape archiver”) weist auf seine ursprüngliche Verwendung hin: Das Programm war ursprünglich für die Verwaltung von Bandarchiven zuständig. Es leistet aber mehr als einfach nur Dateien zusammenzufassen: Tar können Sie über Optionen anweisen, die Archive direkt mit Gzip oder Bzip2 zu komprimieren – so entstehen die typischen tar.gz– und tar.bz2-Archive.

Mehrere Dateien fassen Sie zu einem Archiv zusammen, indem Sie beispielsweise

tar -cvf archiv.tar datei1 datei2

eingeben. Die drei Optionen -c, -v und -f, die hier zusammengefasst wurden, sorgen dafür, dass Tar ein Archiv anlegt (“c” für englisch “create”), dabei verrät, was im Hintergrund passiert (“v” für englisch “verbose”), und das erste Argument (archiv.tar) als Archivnamen interpretiert (“f” für englisch “file”).

Stellen Sie zu einem späteren Zeitpunkt fest, dass Sie eine Datei vergessen haben, müssen Sie das Archiv nicht neu packen, sondern hängen diese einfach über -r an:

tar -rf archiv.tar datei3

Genauso leicht ist das Entpacken mit der Option -x (“x” für englisch “extract”, auspacken):

tar -xvf archiv.tar

Um sicherzustellen, dass Tar keine vorhandenen Dateien mit Archivinhalten überschreibt, entpacken Sie das Archiv sicherheitshalber in einem temporären Unterordner oder ersetzen im Aufruf -x durch -t, um zunächst einen Trockenlauf durchzuführen und zu sehen, welche Dateien und Verzeichnisse sich im Archiv befinden.

Ganze Verzeichnisse inklusive ihrer Unterordner erfassen Sie übrigens auf dieselbe Weise – geben Sie statt einzelner Dateinamen einfach den Ordner an:

$ tar -cvf archiv.tar ordner/
test/
test/screenie.bmp
test/link.bmp
test/neu/
test/neu/screenie.jpg
test/neu/neu/
…

Gerade, wenn Sie Tar für Backups einsetzen, kann es sinnvoll sein, einzelne Verzeichnisse auszuklammern. Dabei hilft der Parameter --exclude. Weiterhin praktisch für solche Sicherungskopien ist der Parameter --rsh-command, über den Sie Tar beispielsweise mitteilen, dass es das Backup per SSH [1] auf einen anderen Rechner übertragen soll. Ein vollständiger Beispielaufruf sieht dann so aus:

tar -cvf user@host:/scratch/tmp/backup_$(date '+%Y_%m_%d').tar --rsh-command=/usr/bin/ssh --exclude=/proc /

Aufgeschlüsselt bedeutet der recht lange Kommandozeilenaufruf: Erstelle per SSH auf dem Rechner host im Verzeichnis /scratch/tmp/ eine Sicherungskopie, deren Name sich aus backup_, dem aktuellen Datum [2] und der Dateiendung .tar zusammensetzt (zum Beispiel backup_2005_09_05.tar). Dieses Backup umfasst alles ausgehend vom Wurzelverzeichnis /, klammert aber das Verzeichnis /proc aus, das keine echten Dateien enthält.

Und jetzt alle!

Wie schon erwähnt, bringt Tar einige Parameter mit, die das Archiv in einem Rutsch mit Gzip oder Bzip2 komprimieren. Für die Gzip-Variante hat der Aufruf die Form

tar -cvzf archiv.tar.gz Datei(en)

Soll stattdessen Bzip2 zum Einsatz kommen, ersetzen Sie die Option -z durch -j:

tar -cvjf archiv.tar.bz2 Datei(en)

Entsprechend setzen Sie die Parameter -z und -j auch beim Entpacken wieder ein und sparen einen Arbeitsschritt, indem Sie beispielsweise statt

bunzip2 archiv.tar.bz2
tar -xvf archiv.tar

einfach

tar -xvjf archiv.tar.bz2

tippen.

Glossar

Symlink

Ein symbolischer Link (oder Softlink) ist ein Verweis auf eine andere Datei, den Anwendungsprogramme genau wie die Datei selbst behandeln. Wenn die Datei, auf die ein Symlink verweist, gelöscht wird, zeigt der Link ins Leere. Symlinks erzeugt das Kommando ln -s QuelleZiel.

stdout

Es gibt drei “Standardkanäle”: stdin (Standardeingabe), stdout (Standardausgabe) und stderr (Standardfehlerausgabe). Laufende Programme erwarten ihren Input von der Standardeingabe, zum Beispiel über die Tastatur. Die Ausgabe der Programme sehen Sie in der Standardausgabe, also meist in einem Terminal-Fenster. Die Standardfehlerausgabe landet in der Regel am gleichen Ort: Dort schreiben Programme Warnungen und Fehlermeldungen hin.

Infos

[1] SSH-Artikel: Heike Jurzik, “Sicher gesendet – ssh und scp”, LinuxUser 07/2003, S. 81 ff.

[2] Mehr zu date und cal: Heike Jurzik, “Kalender auf der Kommandozeile”, LinuxUser 07/2005, S. 88 ff.

LinuxUser 10/2005 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben