Compress, Deflate, Archiving

Archivierungsprogramme

tar ist der „Tape Archiver“: ein Programm, welches mehrere Dateien zu einer Datei - dem Archiv, dessen Dateiformat in der ersten Version seit 1979 existiert - zusammenfasst, welches früher dann sequentiell auf Bänder geschrieben wurde.

Eine tar-Datei ist nicht komprimiert; das Programm nutzt zur Komprimierung seiner .tar-Dateien bei Angabe entsprechender Parameter andere Tools wie beispielsweise gzip. Solche Dateinamen enden auf .tar.gz.

star ist ein Nachfolger von tar. star muss per yum -y install star nachinstalliert werden, ist aber kompatibel: die tar-Parameter gelten auch für star.

Warum wird tar heute immer noch verwendet? Der Hauptvorteil eines tar-Archivs gegenüber Formaten wie ZIP ist, dass Dateiberechtigungen, Besitzer-/Gruppen-Informationen und SELinux-Kontexte mitgesichert und beim Entpacken wiederherstellt werden (wenn das Quell- und Ziel-Dateisystem die Unix-Dateirechte unterstützt). So ist es bis heute üblich, ein tar-Archiv anzulegen und dieses mit einem Tool der Wahl zu komprimieren. tar kann die Archivierung und Komprimierung in einem Rutsch erledigen - so kommt beispielsweise auch die Dateiendung tar.gz zustande.

Darüber hinaus ist das Kopieren einer tar-Datei über das Netz, die 100’000 Dateien enthält, wesentlich schneller erledigt als die Kopie der 100’000 einzelnen Dateien - vorausgesetzt, tar lässt sich flott durchführen.

Installation:

yum -y install tar

Erzeugt eine Archiv-Datei aus allen Dateien in /etc nach /tmp/etc.tar (c = create, v = verbose, f = file):

tar cvf /tmp/etc.tar /etc

Wie oben, komprimiert aber die tar-Datei nachträglich mit gzip (z = compress, im Standard mit gzip):

tar cvzf /tmp/etc.tar.gz /etc

Datei ans Ende eines bestehenden tar-Archivs anhängen:

tar rvf myarchive.tar file

Extrahiere alle Dateien aus /tmp/etc.tar in das aktuelle Verzeichnis (x = extract):

tar xvf /tmp/etc.tar

Wie oben, dekomprimiere die Datei vor dem Extrahieren mit gzip:

tar xf /tmp/etc.tar.gz

Dekomprimiere gz-Datei in ein anderes Zielverzeichnis:

tar xf file.tar.gz --directory=/tmp

Dekomprimiere alle .tar.gz-Dateien aus dem aktuellen Ordner:

for file in $(ls *tar.gz); do tar xf $file; done

Dekomprimiere xz-Datei:

tar xf file.tar.xz

Liste alle Dateien im tar-Archiv auf (t = list):

tar tf file.tar

tar soll wie gzip die getarte Dateien sofort löschen:

tar cf --remove-files ...

un-tar, aber bestehende Dateien nicht überschreiben:

tar xf --keep-old-files ...

tar mit gzip durchführen und Compression Level setzen:

GZIP=--fast tar --remove-files --use-compress-program gzip --create --file=file.tar.gz folder/

tar mit zst durchführen und Compression Level setzen:

ZSTD_CLEVEL=3 tar --remove-files --use-compress-program zstd --create --file=file.tar.zst folder/

..tipp:

``cpio``  ist ein ähnliches und veraltetes Archivprogramm. Es kann nicht mit Dateien > 4 GB umgehen.

Packprogramme

gzip und bzip2 sind in den hier gezeigten Parametern und ihrem Verhalten identisch. gzip erzeugt .gz-Dateien, bzip2 erzeugt .bz2-Dateien. Das zip-Tool nutzt man in der Regel, wenn komprimierte Dateien auch auf exotischeren Betriebssystemen wie Windows lesbar sein sollen und es nicht so sehr auf die Komprimierung ankommt. Der neue Linux-Standard ist xz, welches mittlerweile auf http://www.kernel.org zur Kernel-Kompression eingesetzt wird.

Über den Daumen gepeilt komprimiert xz am besten, gefolgt von bzip2, gzip und zip.

Am schnellsten arbeiten gzip und zip, jeweils mit deutlichem Vorsprung vor xz. bzip2 geht wesentlich gemächlicher zu Werke.

Man beachte, dass gzip und bzip2 die Input-Dateien durch ihren Output ersetzen. Werden sie auf Verzeichnisse angewandt, arbeiten sie jede Datei einzeln ab. Um eine komprimierte Archivdatei ähnlich dem zip-Format zu erzeugen, setzt man daher gzip/bzip2 zusammen mit tar ein.

Tipp

gzip komprimiert standardmässig den Zeitstempel der Datei sowie den Dateinamen mit - das bedeutet, dass eine zwischenzeitlich neu erstellte Datei mit dem gleichen Inhalt wie vorher eine neue gz-Datei mit anderer Prüfsumme ergibt. Schlecht für deduplizierende Backups. Wer dem Zeitstempel der Datei nicht mitsichert (Option -n), erhält immer die gleiche Prüfsumme.

Aufgabe

gzip

bzip2

zip

xz

Installation

yum -y install gzip

yum -y install bzip2

yum -y install zip

yum -y install xz

Bestmögliche Komprimierung einer Datei

gzip -9 file

bzip -9 file

zip -9 file.zip file

xz -9 file

Komprimierung eines Verzeichnisses inkl. Unterverzeichnisse

gzip -r folder (jede Datei wird einzeln komprimiert)

n/a

zip -r folder.zip folder

n/a

Entpacken einer komprimierten Datei

gunzip file.gz

bunzip2 file.bz2

unzip file.zip

xz --decompress file.xz

Alle XML-Dateien rekursiv gzippen, Dateiname = „aktuelles Datum.gz“:

gzip -rv9 *.xml $(date +%Y%m%d).gz

GZippen, während eine Ausgabe produziert wird:

command-producing-output | gzip -9 > export.csv.gz

Alle XML-Dateien eines Verzeichnisses zusammenfassen:

tar --remove-files -czf /archive/$(date +%Y%m).tar.gz /path/to/*.xml

Alle XML-Dateien älter als 40 Tage auf Basis ihres Modifikationsdatums in monatsweise organisierten ZIP-Dateien mit Dateinamen „yyyymm.zip“ zusammenfassen:

for file in $(find -name *.xml -mtime +40)
do
    TS=$(date --reference $file +%Y%m)
    zip --move -9 $TS.zip $file
done

Passwort-geschützte ZIP-Datei erstellen:

zip -r9 -P mypassword file.zip folder

Alle xml-Dateien mit Modifikationsdatum älter als 40 Tage in einem ZIP-Archiv zusammenfassen:

cd /var/www/html/
for i in $(find . -name *.xml -mtime +40 )
do
    TS=$(date --reference $i +%Y%m)
    zip --move -9 $TS.zip $i
done

Mehrere Dateien mit unzip auf einmal entpacken - die Anführungszeichen sind hier wichtig:

unzip "*.zip"

Built on 2024-10-08