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 |
|
|
|
|
Bestmögliche Komprimierung einer Datei |
|
|
|
|
Komprimierung eines Verzeichnisses inkl. Unterverzeichnisse |
|
n/a |
|
n/a |
Entpacken einer komprimierten Datei |
|
|
|
|
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-11-18