Der Tar-Befehl unter Linux: Tar CVF und Tar XVF werden anhand von Beispielbefehlen erläutert

Der Name tarsteht in den meisten Fällen für Bandarchiv . Die fraglichen "Bänder" wären all jene magnetischen Speicherlaufwerke, die bereits in den 1950er Jahren beliebt waren.

Dies deutet darauf hin, dass das tarTool möglicherweise etwas alt ist und seine Blütezeit überschritten hat. Aber die Wahrheit ist, dass im Laufe der Jahre und durch alle seismischen Veränderungen in der IT-Welt tarnichts von ihrer Kraft und ihrem Wert verloren hat.

In diesem Artikel, der auf Inhalten aus meinem Linux in Action-Buch basiert, zeige ich Ihnen die Grundlagen der Erstellung, Komprimierung und Wiederherstellung von Tar-Archiven. Beginnen wir am Anfang.

Archive erstellen

In diesem Beispiel werden alle Dateien und Verzeichnisse innerhalb und unterhalb des aktuellen Arbeitsverzeichnisses erstellt und eine Archivdatei erstellt, die ich geschickt benannt habe archivename.tar.

Hier verwende ich drei Argumente nach dem Befehl tar:

  • das cweist tar an, ein neues Archiv zu erstellen,
  • v Setzt die Bildschirmausgabe auf ausführlich, damit ich Updates bekomme, und
  • f zeigt auf den Dateinamen, den ich dem Archiv geben möchte.

Das *ist das, was erzählt wird taralle Dateien und lokale Verzeichnisse rekursiv aufzunehmen.

$ tar cvf archivename.tar * file1 file2 file3 directory1 directory1/morestuff directory1/morestuff/file100 directory1/morestuff/file101 

Der Befehl tar verschiebt oder löscht niemals eines der ursprünglichen Verzeichnisse und Dateien, die Sie ihm zuführen - er erstellt nur archivierte Kopien.

Sie sollten auch beachten, dass die Verwendung eines Punkts (.) Anstelle eines Sterns (*) im vorherigen Befehl sogar versteckte Dateien (deren Dateinamen mit einem Punkt beginnen) in das Archiv aufnehmen würde.

Wenn Sie auf Ihrem eigenen Computer mitverfolgen (wie Sie es definitiv sollten), wird eine neue Datei mit dem Namen archivename.tar angezeigt. Die Dateinamenerweiterung .tar ist nicht erforderlich, aber es ist immer eine gute Idee, den Zweck einer Datei auf möglichst viele Arten klar zu kommunizieren.

Das Extrahieren Ihres Archivs zum Wiederherstellen der Dateien ist einfach: Verwenden Sie einfach xvfstatt cvf. Dadurch werden im Beispiel neue Kopien der Originaldateien und -verzeichnisse am aktuellen Speicherort gespeichert.

$ tar xvf archivename.tar file1 file2 file3 directory1 directory1/morestuff directory1/morestuff/file100 directory1/morestuff/file101 

Natürlich können Sie Ihre extrahierten Dateien auch mit dem -CArgument an einen anderen Ort senden lassen , gefolgt vom Zielspeicherort:

$ tar xvf archivename.tar -C /home/mydata/oldfiles/ 

Sie möchten nicht immer alle Dateien in einem Verzeichnisbaum in Ihr Archiv aufnehmen.

Angenommen, Sie haben einige Videos produziert, diese werden jedoch derzeit zusammen mit allen Arten von Grafik-, Audio- und Textdateien (mit Ihren Notizen) in Verzeichnissen gespeichert. Die einzigen Dateien, die Sie sichern müssen, sind die endgültigen Videoclips mit der Dateinamenerweiterung .mp4.

So geht's:

$ tar cvf archivename.tar *.mp4 

Das ist großartig. Aber diese Videodateien sind enorm. Wäre es nicht schön, dieses Archiv durch Komprimierung etwas kleiner zu machen?

Sag nichts mehr! Führen Sie einfach den vorherigen Befehl mit dem zArgument (zip) aus. Dadurch wird das Programm gzip angewiesen, das Archiv zu komprimieren.

Wenn Sie der Konvention folgen möchten, können Sie .gzzusätzlich zu der .tarbereits vorhandenen eine Erweiterung hinzufügen . Denken Sie daran: Klarheit.

So würde sich das abspielen:

$ tar czvf archivename.tar.gz *.mp4 

Wenn Sie dies in Ihren eigenen MP4-Dateien ausprobieren und dann ls -l in dem Verzeichnis ausführen, das die neuen Archive enthält, stellen Sie möglicherweise fest, dass die .tar.gzDatei nicht viel kleiner als die .tarDatei ist, vielleicht 10% oder so. Was ist damit?

Nun, das .mp4Dateiformat selbst ist komprimiert, so dass gzip viel weniger Platz hat, um seine Aufgaben zu erledigen.

Da tar die Linux-Umgebung vollständig kennt, können Sie damit Dateien und Verzeichnisse auswählen, die sich außerhalb Ihres aktuellen Arbeitsverzeichnisses befinden. In diesem Beispiel werden alle .mp4Dateien im /home/myuser/Videos/Verzeichnis hinzugefügt:

$ tar czvf archivename.tar.gz /home/myuser/Videos/*.mp4 

Da Archivdateien sehr groß werden können, kann es manchmal sinnvoll sein, sie in mehrere kleinere Dateien aufzuteilen, sie in ihr neues Zuhause zu übertragen und die Originaldatei am anderen Ende neu zu erstellen. Das geteilte Werkzeug ist für diesen Zweck gemacht.

In diesem Beispiel -bwird Linux angewiesen, die Datei archivename.tar.gz in Teile mit einer Größe von 1 GB aufzuteilen. Die Operation benennt dann jedes der Teile - archivename.tar.gz.partaa, archivename.tar.gz.partab, archivename.tar.gz.partac usw.:

$ split -b 1G archivename.tar.gz "archivename.tar.gz.part" 

Auf der anderen Seite erstellen Sie das Archiv neu, indem Sie die einzelnen Teile nacheinander lesen (cat archivename.tar.gz.part *) und die Ausgabe dann in eine neue Datei mit dem Namen archivename.tar.gz umleiten:

$ cat archivename.tar.gz.part* > archivename.tar.gz 

Streaming-Dateisystemarchive

Hier fängt das gute Zeug an. Ich werde Ihnen zeigen, wie Sie ein Archivabbild einer funktionierenden Linux-Installation erstellen und an einen Remotespeicherort streamen - alles mit einem einzigen Befehl. Hier ist der Befehl:

# tar czvf - --one-file-system / /usr /var \ --exclude=/home/andy/ | ssh [email protected] \ "cat > /home/username/workstation-backup-Apr-10.tar.gz" 

Anstatt zu versuchen, das alles sofort zu erklären, werde ich kleinere Beispiele verwenden, um es Stück für Stück zu untersuchen.

Lassen Sie uns ein Archiv des Inhalts eines Verzeichnisses namens "Wichtiges Zeug" erstellen, das mit wirklich wichtigen Dingen gefüllt ist:

$ tar czvf - importantstuff/ | ssh [email protected] "cat > /home/username/myfiles.tar.gz" importantstuff/filename1 importantstuff/filename2 [...] [email protected]'s password: 

Lassen Sie mich dieses Beispiel erklären. Anstatt den Archivnamen direkt nach den Befehlsargumenten einzugeben (wie Sie es bisher getan haben), habe ich einen Bindestrich (czvf -) verwendet.

Der Bindestrich gibt Daten an die Standardausgabe aus. Sie können die Details des Archivdateinamens an das Ende des Befehls zurückschieben und tar anweisen, stattdessen den Quellinhalt für das Archiv zu erwarten.

Ich habe dann das unbenannte, komprimierte Archiv an ein SSH-Login auf einem Remote-Server weitergeleitet, auf dem ich nach meinem Passwort gefragt wurde.

Der in Anführungszeichen eingeschlossene Befehl führte cat dann für den Archivdatenstrom aus, der den Inhalt des Streams in eine Datei namens myfiles.tar.gz in meinem Home-Verzeichnis auf dem Remote-Host schrieb.

Ein Vorteil der Generierung von Archiven auf diese Weise besteht darin, dass Sie den Aufwand eines mittleren Schritts vermeiden. Es ist nicht erforderlich, eine Kopie des Archivs vorübergehend auf dem lokalen Computer zu speichern. Stellen Sie sich vor, Sie sichern eine Installation, die 110 GB des verfügbaren Speicherplatzes von 128 GB ausfüllt. Wohin würde das Archiv gehen?

Das war nur ein Verzeichnis von Dateien. Angenommen, Sie müssen ein aktives Linux-Betriebssystem auf einem USB-Laufwerk sichern, damit Sie es auf einen separaten Computer verschieben und auf dem Hauptlaufwerk dieses Computers ablegen können.

Angenommen, es gibt bereits eine Neuinstallation derselben Linux-Version auf dem zweiten Computer, wird beim nächsten Kopieren / Einfügen ein genaues Replikat des ersten generiert.

HINWEIS: Dies funktioniert nicht auf einem Ziellaufwerk, auf dem noch kein Linux-Dateisystem installiert ist. Um mit dieser Situation umzugehen, müssen Sie verwenden dd.

The next example creates a compressed archive on the USB drive known as /dev/sdc1.

The --one-file-system argument excludes all data from any file system besides the current one. This means that pseudo partitions like /sys/ and /dev/ won’t be added to the archive. If there are other partitions that you want to include (as you’ll do for /usr/ and /var/ in this example), then they should be explicitly added.

Finally, you can exclude data from the current file system using the --exclude argument:

# tar czvf /dev/sdc1/workstation-backup-Apr-10.tar.gz \ --one-file-system \ / /usr /var \ --exclude=/home/andy/ 

Now let’s go back to that full-service command example. Using what you’ve already learned, archive all the important directories of a file system and copy the archive file to a USB drive. It should make sense to you now:

# tar czvf - --one-file-system / /usr /var \ --exclude=/home/andy/ | ssh [email protected] \ "cat > /home/username/workstation-backup-Apr-10.tar.gz" 

There's much more administration goodness in the form of books, courses, and articles available at my bootstrap-it.com.