Gzip: Unterschied zwischen den Versionen

Aus Foxwiki
Zeile 97: Zeile 97:




=== Dateien komprimieren mit gzip ===
== Dateien komprimieren mit gzip ==
  gzip [-cdfhlLnNqrtvV19] [-S Endung [Datei ...]
  gzip [-cdfhlLnNqrtvV19] [-S Endung [Datei ...]



Version vom 29. Januar 2023, 10:20 Uhr

topic kurze Beschreibung

Beschreibung

In Debian werden reguläre, einzelne Dateien mit dem Befehl "gzip" komprimiert.

  • Jede komprimierte Datei erhält die Endung .gz

Installation

Anwendungen

Fehlerbehebung

Syntax

$ gzip -Option <Datei>

Optionen

Option Beschreibung
-r rekursiv in einem Verzeichnis alle Dateien komprimieren
-d dekomprimieren
-v detailliert
-k Die Originaldatei wird beibehalten und nicht gelöscht
-l Gibt Details zum Archiv aus, wie z.B. Kompressionsrate, Größe der unkomprimierten Datei etc.
-1 bis -9 Gibt den Kompressionsgrad an. 1 ist die schlechteste aber schnellste Komprimierung, 9 die beste aber langsamste Komprimierung. Voreinstellung ist 5.

Parameter

Umgebungsvariablen

Exit-Status

Konfiguration

Dateien

Sicherheit

Dokumentation

RFC

Man-Pages

Info-Pages

Siehe auch

Links

Projekt-Homepage

Weblinks

Einzelnachweise

Testfragen

Testfrage 1

Antwort1

Testfrage 2

Antwort2

Testfrage 3

Antwort3

Testfrage 4

Antwort4

Testfrage 5

Antwort5

TMP

Beispiel

Komprimieren von Dateien

Man nehme den Befehl gzip + file Name

gzip test.pdf

Zwingen die Originaldatei nicht zu löschen

Um das Löschen der Quelldatei zu verhindern, muss man die Option -k verwenden

gzip -k test.pdf

Rekursive Datei Komprimierung

Um alle Dateien im Verzeichnis rekursiv zu komprimieren brauch man die Option -r und * für alle Dateien. Es werden alle Dateien in einzelnen .gz Dateien gespeichert.

gzip -k *

Entpacken von Dateien

Um eine Datei zu entpacken, verwenden man die Option -d.

gzip -d test.gz

Details einer komprimierten Datei auflisten

Dies wird mit der Option -l erreicht

gzip -l test.gz

Kompressionsgrad verändern

Für die Veränderung des Kompressionsgrads braucht man die Option -1 bis-9

gzip -9 test.pdf


Dateien komprimieren mit gzip

gzip [-cdfhlLnNqrtvV19] [-S Endung [Datei ...]

gzip komprimiert Dateien mit dem LZ77 Lempel-Ziv Algorithmus. gzip erzielt erheblich bessere Kompressionsraten als das mit dem LZW-Algorithmus arbeitende compress-Programm. Weil es sich ansonsten sehr ähnlich verhält, ist abzusehen, daß es compress als Standardpacker im Bereich der freien Software verdrängen wird. Mit gzip können auch Dateien ausgepackt werden, die mit compress oder pack gepackt wurden. Archive, die mit zip gepackt wurden, können mit gzip nur ausgepackt werden, wenn sie eine einzige Datei enthalten und mit der ,,deflation`` Methode gepackt wurden.

gzip ist kein Archivpacker wie lharc, arj oder pkzip.

gzip komprimiert einzelne Dateien, unabhängig davon, ob die resultierende Datei tatsächlich kleiner ist, und ersetzt die Urdatei durch die komprimierte, indem es an den Dateinamen die Endung `.gz' anhängt. Wenn der Dateiname durch Anhängen der Endung unzulässig lang würde, verkürzt gzip automatisch den Namen um die erforderliche Anzahl Zeichen.

Die Zeitmarke der Datei und die Zugriffsrechte bleiben beim Komprimieren erhalten. Um die Wiederherstellung der Zeitmarke und des Dateinamens sicherzustellen, werden diese Daten mit eingepackt und können beim entkomprimieren verwendet werden. Außerdem wird eine CRC-Checksumme mit eingepackt, mit der beim Auspacken automatisch die Integrität der Daten geprüft wird.

Wenn gzip ohne Dateinamen aufgerufen wird, liest es von der Standardeingabe und schreibt auf die Standardausgabe. Der gleiche Effekt wird erzielt, wenn anstelle einer Eingabedatei ein Minuszeichen `-' angegeben wird.

Wie bei compress kann auch gzip auf andere Namen gelinkt werden, um bestimmte Aufgaben zu erfüllen.

Unter dem Namen gunzip arbeitet es wie gzip -d, packt also komprimierte Dateien der oben aufgeführten Formate aus. gunzip erwartet die Endung `.gz', `-gz', `.tgz', `.taz', `.z', `-z', `-z' oder `.Z' an dem Dateinamen. Außerdem wird die Datei auf eine ,,magische Zahl`` überprüft, die mit gzip komprimierte Dateien identifiziert. Nach dem Auspacken bleiben die Zugriffsrechte und das Erstellungsdatum der Datei erhalten.

zcat arbeitet wie gzip -dc, schreibt also die entkomprimierte Datei auf die Standardausgabe und läßt die komprimierte Datei unberührt. Wenn die Eingabedatei die korrekte magische Zahl enthält, wird sie ausgepackt, egal welche Endung der Dateiname hat.

Optionen

-c schreibt die (ent)komprimierte Datei auf die Standardausgabe, anstatt die Datei zu ersetzen
-d (decompress) dekomprimiert die Datei
-f (force) ersetzt bestehende Dateien mit Endung `.gz'; normalerweise fragt gzip vor dem Überschreiben solcher Dateien nach
-h (help) gibt eine Kurzhilfe zum Programm aus
-l (list) zeigt den in einer mit gzip komprimierten Datei gespeicherten originalen Dateiname, sowie die originale und die gepackte Größe an; wenn die -v-Option gesetzt ist, wird zusätzlich die Zeitmarke und die Checksumme ausgegeben
-L (license) gibt eine Kurzfassung des Lizenztextes aus
-n (noname) unterdrückt beim Einpacken das Speichern des Dateinamen und der Zeitmarke (nur wenn der Name nicht gekürzt werden muß); beim Auspacken wird die Wiederherstellung des originalen Namens mit der Zeitmarke unterdrückt; diese Option ist Voreinstellung zum Entpacken
-N (name) veranlaßt beim Einpacken die Sicherung des originalen Namen und der Zeitmarke in der gepackten Datei und beim Auspacken die Wiederherstellung dieser Daten an der dekomprimierten Datei; diese Option ist Voreinstellung beim Einpacken
-q (quiet) unterdrückt alle Warnungen
-r (recursive) packt alle Dateien in den angegebenen Unterverzeichnissen
-S Endung veranlaßt die Verwendung der neuen Endung anstelle von `.gz'
-t (test) prüft die Integrität der angegebenen Datei
-v (verbose) gibt den Namen und den Kompressionsfaktor für jede Datei aus
-V (Version) gibt die Versionsnummer des Programms aus
Ziffer bestimmt mit einer Ziffer von 1 bis 9 die Kompressionstiefe; 1 bedeutet schnell und schlecht komprimiert, 9 bedeutet langsam und optimal komprimiert

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"
$ 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, ((2)) ).

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

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 Quelle Ziel .

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.

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.

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.

"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.