15 tar-Befehlsbeispiele für Sysadmin und Entwickler

Das tar-Format ist eine weitverbreitete Methode zur Dateisammlung unter Unix- und Linux-Systemen.

Die Bezeichnung „tar“ leitet sich von „Tape Archive“ ab, da es ursprünglich für die Datenspeicherung auf Bandlaufwerken entwickelt wurde. Gelegentlich wird es auch als „Tarball“ bezeichnet.

Standardmäßig erstellt tar unkomprimierte Archive. Jedoch können verschiedene Komprimierungsverfahren angewendet werden, um die Ausgabegröße zu reduzieren. Das tar-Tool ist in den meisten Linux-Distributionen vorinstalliert, und das Format wird auch von anderen Betriebssystemen wie Windows und macOS durch verschiedene Werkzeuge und Anwendungen unterstützt.

In diesem Beitrag werden wir uns einige typische Beispiele für die Nutzung des tar-Befehls und seiner Optionen ansehen.

Beginnen wir also…

Archivierung mit tar erstellen

Die allgemeine Syntax zur Erstellung eines einfachen, unkomprimierten Archives mit tar ist:

$ tar cvf <archivname> <dateien-zum-archivieren>

Hierbei steht c für „create“ (erstellen), v für „verbose“ (ausführliche Ausgabe) und f für die Angabe des Archivdateinamens. Konventionsgemäß wird der Name der TAR-Datei mit der Endung .tar versehen. Die zu archivierenden Dateien können als Platzhalter oder als individuelle Datei- oder Pfadangaben angegeben werden.

In meinem Verzeichnis befinden sich beispielsweise drei Dateien:

$ ls -l
total 12
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt
$

Um ein tar-Archiv mit allen drei Dateien zu erzeugen, führe ich folgenden Befehl aus:

$ tar cvf archive.tar *
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar
$

Es ist auch möglich, nur bestimmte Dateien für die Archivierung auszuwählen, wie zum Beispiel:

$ tar cvf archive1.tar file1.txt file2.txt
file1.txt
file2.txt
$ ls -l archive1.tar
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive1.tar
$

Erstellung von komprimierten Archiven (GZ)

Neben der reinen Archivierung unterstützt tar auch das Komprimieren von Dateien, um Speicherplatz zu sparen. Eines der gebräuchlichsten Komprimierungsformate ist Gunzip, das üblicherweise durch die Dateiendung .gz nach .tar oder als .tgz gekennzeichnet wird. Mithilfe des Flags z können wir die Komprimierung mit gunzip aktivieren. Ein Beispiel hierfür ist:

$ tar cvzf archive.tar.gz file*
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar archive.tar.gz
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair   188 Sep 12 20:21 archive.tar.gz
$

Hier ist deutlich zu sehen, dass die Größen der beiden Archive deutlich voneinander abweichen, obwohl beide die gleichen drei Dateien enthalten. Dies liegt an der angewandten Komprimierung mithilfe des Flags z.

Komprimierte Archive erstellen (BZ2)

tar unterstützt verschiedene andere Komprimierungsformate, darunter bz2 oder bzip2, das als .tar.bz2 oder .tbz2 gekennzeichnet wird. Dieses Format kann eine noch geringere Archivgröße erzielen, benötigt jedoch mehr CPU-Leistung, was den Komprimierungs-/Dekomprimierungsprozess im Vergleich zu .gz Archiven verlangsamen kann.

Ein Beispiel hierfür:

$ tar cvjf archive.tar.bz2 file*
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar archive.tar.gz archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair   212 Sep 12 20:25 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair   188 Sep 12 20:21 archive.tar.gz
$ file archive.tar*
archive.tar:     POSIX tar archive (GNU)
archive.tar.bz2: bzip2 compressed data, block size = 900k
archive.tar.gz:  gzip compressed data, from Unix, original size modulo 2^32 10240
$

Extrahieren aller Dateien

Ein tar-Archiv (ob komprimiert oder nicht) lässt sich einfach mit der Option x entpacken. Die folgenden Beispiele verdeutlichen die Verwendung:

$ tar xvf archive.tar
file1.txt
file2.txt
file3.txt
$ ls -l
total 24
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 19 18:25 archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair    13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair    19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair    24 Sep 12 20:08 file3.txt
$

Gleiches gilt für ein .gz-komprimiertes Archiv:

$ tar xvf archive.tar.gz
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 19 18:27 archive.tar.gz
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair  19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair  24 Sep 12 20:08 file3.txt
$

Oder für ein .bz2-komprimiertes Archiv:

$ tar xvf archive.tar.bz2
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair  19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair  24 Sep 12 20:08 file3.txt
$

Auflisten des Inhalts eines tar-Archivs

Um den Inhalt eines tar-Archivs anzuzeigen, kann das Flag t verwendet werden:

$ tar tvf archive.tar.bz2
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
$

Extrahieren einzelner Dateien

Es ist möglich, nur eine bestimmte Datei aus einem tar-, tar.gz– oder tar.bz2-Archiv zu extrahieren, indem der Dateiname angegeben wird:

$ tar xvf archive.tar.bz2 file1.txt
file1.txt
$ ls -l
total 8
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
$

Ebenso können mehrere durch Leerzeichen getrennte Dateinamen angeführt werden, um diese gleichzeitig zu entpacken.

$ tar xvf archive.tar.bz2 file1.txt file3.txt
file1.txt
file3.txt
$ ls -l
total 12
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair  24 Sep 12 20:08 file3.txt
$

Extrahieren mit Platzhaltern

Um eine oder mehrere Dateien mithilfe eines Platzhaltermusters zu extrahieren, verwenden Sie das Flag --wildcards:

$ tar xvf archive.tar.bz2 --wildcards "file*"
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair  19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair  24 Sep 12 20:08 file3.txt
$

Hinzufügen von Dateien zum Archiv

Neue Dateien lassen sich zu bestehenden unkomprimierten Tarballs hinzufügen, indem die Option r oder --append mit neuen Dateinamen oder Platzhaltermustern verwendet wird (beachten Sie, dass dies nur mit unkomprimierten .tar-Dateien funktioniert, nicht mit tar.gz oder tar.bz2 Formaten):

$ tar rvf archive.tar file-new*
file-new.txt
file-new2.txt
$ tar tvf archive.tar
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
-rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt
-rw-r--r-- abhisheknair/abhisheknair  9 2021-09-19 19:10 file-new.txt
-rw-r--r-- abhisheknair/abhisheknair  9 2021-09-19 19:10 file-new2.txt
$

Die Ausgabe des Inhalts von archive.tar zeigt nun die zwei neu hinzugefügten Dateien.

Löschen von Dateien aus dem Archiv

Das Entfernen von Dateien aus einem tar-Archiv ist mit dem Flag --delete möglich (vergleichen Sie die Ausgabe von tar vor und nach dem Löschen):

$ tar tvf archive.tar
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
-rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt
-rw-r--r-- abhisheknair/abhisheknair  9 2021-09-19 19:10 file-new.txt
-rw-r--r-- abhisheknair/abhisheknair  9 2021-09-19 19:10 file-new2.txt
$ tar --delete -f archive.tar file-new.txt file-new2.txt
$ tar tvf archive.tar
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
-rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt
$

Auch hier gilt, dass dies nur bei unkomprimierten Tarballs funktioniert und bei komprimierten Formaten scheitert.

Erstellung mit Verifizierung

Beim Erstellen unkomprimierter tar-Dateien lässt sich der Inhalt des Archivs mit dem Flag W verifizieren:

$ tar cvfW archive.tar file*.txt
file1.txt
file2.txt
file3.txt
Verify file1.txt
Verify file2.txt
Verify file3.txt
$

Dieses Feature lässt sich nicht in Verbindung mit den Komprimierungs-Flags verwenden, aber die entstandene tar-Datei kann später mit gzip oder ähnlichen Tools komprimiert werden.

Extrahieren von tar in ein Verzeichnis

Um den Inhalt eines Tarballs in ein bestimmtes Verzeichnis anstatt des aktuellen zu extrahieren, verwenden Sie das Flag -C gefolgt vom Verzeichnispfad:

$ tar xvf archive.tar -C new-directory/
file1.txt
file2.txt
file3.txt
file2.txt
file4.txt
$ ls -l new-directory/
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 15 Sep 19 18:59 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt
-rw-r--r-- 1 abhisheknair abhisheknair 10 Sep 19 18:58 file4.txt
$

Verwenden des Diff-Flags

Das Flag --diff oder d kann genutzt werden, um Unterschiede zwischen den Dateien im Archiv und denjenigen im Dateisystem zu erkennen. Das folgende Beispiel zeigt einen Vergleich, bei dem die Datei innerhalb und außerhalb von tar einmal identisch war. Nach einer Änderung wurde der Befehl erneut ausgeführt, um den Unterschied anzuzeigen.

$ tar dvf archive.tar file4.txt
file4.txt
$
$ echo newline > file4.txt
$
$ tar dvf archive.tar file4.txt
file4.txt
file4.txt: Mod time differs
file4.txt: Size differs
$

Dateien ausschließen

Das Ausschließen von Dateien kann bei der Erstellung von Tar-Archiven notwendig sein. Dies lässt sich mit dem Flag --exclude realisieren.

$ tar --exclude="dir/file2.txt" --exclude="dir/file-new*.txt" -cvzf archive.tar.gz dir/
dir/
dir/file1.txt
dir/file3.txt
$ ls -l dir
total 24
-rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new.txt
-rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:20 file-new3.txt
-rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:27 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 6 Sep 19 19:27 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 8 Sep 19 19:27 file3.txt
$ tar tvf archive.tar.gz
drwxr-xr-x abhisheknair/abhisheknair 0 2021-09-19 19:30 dir/
-rw-r--r-- abhisheknair/abhisheknair 5 2021-09-19 19:27 dir/file1.txt
-rw-r--r-- abhisheknair/abhisheknair 8 2021-09-19 19:27 dir/file3.txt
$

Wie die Ausgabe zeigt, können mehrere --exclude-Flags angegeben werden, um Dateinamen oder Muster in einer UND-Bedingung festzulegen. Von den sechs Dateien im Verzeichnis im obigen Beispiel haben nur zwei die Bedingungen für die Aufnahme in archive.at.gz erfüllt.

Anzeigen der Größe von tar-Inhalten

Die Größe des Inhalts eines komprimierten Tar-Archivs lässt sich mit folgendem Befehl anzeigen:

$ tar tvf archive.tar.gz
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
$ tar -xzf archive.tar.gz --to-stdout|wc -c
56
$

Analog für das .bz2 Archiv:

$ tar tvf archive.tar.bz2
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
$ tar -xjf archive.tar.bz2 --to-stdout|wc -c
56
$

Beibehalten von Berechtigungen

Standardmäßig bewahrt der tar-Befehl die Berechtigungen von Dateien und Verzeichnissen, die archiviert werden, obwohl dies explizit mit dem Flag -p oder --preserve-permissions angegeben werden kann:

$ tar cvpzf archive.tar.gz *.txt
file1.txt
file2.txt
file3.txt
$

Zusammenfassung 👨‍💻

tar ist ein bewährtes und nützliches Werkzeug in Unix/Linux-Systemen, das primär für Archivierungs- und Backup-Zwecke verwendet wird. Das Programm wurde im Laufe der Zeit um viele Optionen erweitert. Es ist sowohl für einfache als auch für komplexe Aufgaben geeignet, wenn man die vorhandenen Funktionen kennt. Dieser Artikel hat einige grundlegende Operationen beleuchtet, die mit dem tar-Befehl durchgeführt werden können, und zeigt, wie es bei alltäglichen Aufgaben der Systemverwaltung unterstützt.

Um weitere Informationen zu erhalten, lesen Sie die Manpage man tar oder verwenden Sie den Befehl tar --help oder tar --usage.