# 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. 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 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:
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.