compress
compress
(/usr/bin/compress
) ist ein Packprogramm unter UNIXen und UNIX-ähnlichen Betriebssystemen. Seine Funktion wie auch sein Verhalten ist im POSIX-Standard (und damit auch in der Single UNIX Specification und der Norm IEEE 1003.1) festgelegt.[1] Es bildet mit seinem Gegenstück uncompress
(/usr/bin/uncompress
) die übliche Methode, Archive platzsparend abzulegen.
Arbeitsweise
Auf Systemen, die den Lempel-Ziv-Algorithmus nicht unterstützen, verändert compress
die – als Argument übergebenen – Dateien nicht, sondern bricht mit einem Error Level größer 2 ab. Ebenfalls zu einem Abbruch mit Fehlermeldung kommt es, wenn die Dateierweiterung .Z
die durch die Kernel-Konstante NAME_MAX
festgelegte maximale Namenslänge überschreiten lassen würde.
Auf allen anderen Systemen werden die Dateien gepackt und durch die gepackte Datei ersetzt, deren Namen um ein angehängtes .Z
erweitert wird. Reicht die Berechtigung des ausführenden Prozesses dazu aus, so werden Berechtigungen und Besitzer dabei erhalten. Diese Dateien können mit dem Programm uncompress
(/usr/bin/uncompress
) wieder entpackt werden, wobei uncompress
die angehängte Dateiendung .Z
wieder entfernt.
Wie auch gzip
und bzip2
komprimiert compress
ausschließlich einzelne Dateien. Sollen mehrere Dateien oder gar ganze Directory-Hierarchien zusammengefasst werden, so wird es typischerweise mit einem Archivierungsprogramm (tar
, cpio
, backup
etc.) zusammen eingesetzt, dessen Ausgabe anschließend komprimiert werden kann.
Patentrechtliche Erwägungen
Der POSIX-Standard legt fest, dass compress
Dateien nach dem adaptiven Lempel-Ziv-Algorithmus (auch: LZC, einer Variante des LZW-Algorithmus) bearbeitet. Dieser Algorithmus (genauer eigentlich: der zugrundeliegende Algorithmus LZ78) wie auch seine Erweiterung durch Terry A. Welch wurde bis 2003 (in Japan bis 2004) durch US-amerikanische Patente[2][3] geschützt, die an die Sperry Corporation ausgegeben wurden.
Alternativen
Diese Abhängigkeit von einem proprietären Verfahren war mit ein Grund für die Entwicklung der Alternativen gzip
wie auch bzip2
, die beide auf ähnlichen, allerdings gemeinfreien, Kompressionsverfahren mit variablen Zeigern basieren. Das GNU-Betriebssystem verwendet deshalb gzip
(GNU-zip) als Ersatz für compress
. gzip
kann die mit compress
erzeugten Dateien zwar lesen und entpacken, die Kompression wird jedoch wegen der dazu verwendeten (ehemals) patentierten Verfahren nicht unterstützt.
Hinweise zur Verwendung, Beispiele
Für gewöhnlich nimmt compress
einen oder mehrere Dateinamen als Argument entgegen und ersetzt diese Dateien direkt im Filesystem durch ihre komprimierte Version. Mit dem Switch -c
wird die komprimierte Version stattdessen auf stdout
ausgegeben und der Filesystem-Inhalt nicht verändert. Dies kann einerseits genutzt werden, um komprimierte Backups auf allerlei externen Geräten (Bandlaufwerke etc.) abzulegen (der Datenstrom wird dann einem geeigneten Treiberprogramm über eine Pipeline zur Verfügung gestellt), oder um die sonst anfallende Löschung der Ausgangsdateien zu umgehen:
# compress -c /path/to/input > /path/to/output.Z
Außerdem bietet der Switch -c N
die Möglichkeit, die Kompression(-srate) zu beeinflussen: N ist dabei die Anzahl der maximal zu verwendenden Bits für einen Code (Werte zwischen 9 und 14 werden unterstützt). Längere Codes ermöglichen dabei bessere Kompression bei gleichzeitig steigendem Rechenaufwand.
Einzelnachweise
- compress-Spezifikation der Open Group. Abgerufen am 12. Mai 2013 (englisch).
- US Patentschrift Nr. 4464650. Abgerufen am 12. Mai 2013 (englisch).
- US Patentschrift Nr. 4558302. Abgerufen am 12. Mai 2013 (englisch).