451 Stimmen

Ein Verzeichnis archivieren, aber keine vollständigen absoluten Pfade im Archiv speichern

Ich habe folgenden Befehl im Teil eines Backup-Shell-Skripts:

tar -cjf site1.bz2 /var/www/site1/

Wenn ich den Inhalt des Archivs aufliste, erhalte ich:

tar -tf site1.bz2
var/www/site1/style.css
var/www/site1/index.html
var/www/site1/page2.html
var/www/site1/page3.html
var/www/site1/images/img1.png
var/www/site1/images/img2.png
var/www/site1/subdir/index.html

Aber ich möchte den Teil /var/www/site1 aus Verzeichnis- und Dateinamen im Archiv entfernen, um die Extraktion zu vereinfachen und überflüssige, konstante Verzeichnisstrukturen zu vermeiden. Man weiß ja nie, falls ich die gesicherten Websites an einem Ort extrahieren würde, wo Webdaten nicht unter /var/www gespeichert sind.

Für das obige Beispiel würde ich gerne haben:

tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html

So dass beim Extrahieren die Dateien im aktuellen Verzeichnis extrahiert werden und ich die extrahierten Dateien nicht verschieben muss und damit die Unterverzeichnisstruktur erhalten bleibt.

Es gibt bereits viele Fragen zu tar und Backups in stackoverflow und an anderen Stellen im Web, aber die meisten fragen danach, die gesamte Unterverzeichnisstruktur zu entfernen (flach zu machen), oder nur das anfängliche / in den Namen hinzuzufügen oder zu entfernen (ich weiß nicht genau, was sich ändert, wenn man sie extrahiert), aber nicht mehr.

Nachdem ich einige der Lösungen, die hier und da gefunden wurden, sowie das Handbuch gelesen habe, habe ich Folgendes versucht:

tar -cjf site1.bz2 -C . /var/www/site1/
tar -cjf site1.bz2 -C / /var/www/site1/
tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/
tar -cjf site1.bz2 --strip-components=3 /var/www/site1/

Aber keiner von ihnen hat so funktioniert, wie ich es möchte. Einige machen gar nichts, andere archivieren keine Unterverzeichnisse mehr.

Es handelt sich um ein Backup-Shell-Skript, das von einem Cron gestartet wird, also weiß ich nicht genau, welcher Benutzer es ausführt, was der Pfad und das aktuelle Verzeichnis ist, daher ist es immer erforderlich, den absoluten Pfad für alles zu schreiben, und ich würde es vorziehen, das aktuelle Verzeichnis nicht zu ändern, um zu vermeiden, dass im Skript noch etwas weiter bricht (weil es nicht nur Websites sichert, sondern auch Datenbanken, die dann alles an FTP senden etc.).

Wie kann das erreicht werden?

Habe ich das Funktionsprinzip der Option -C einfach missverstanden?

574voto

Lars Brinkhoff Punkte 12886
tar -cjf site1.tar.bz2 -C /var/www/site1 .

In obigem Beispiel wird tar das Verzeichnis /var/www/site1 wechseln, bevor es seine Aufgabe ausführt, weil die Option -C /var/www/site1 angegeben wurde.

Aus man tar:

WEITERE OPTIONEN

  -C, --directory DIR
       wechsle zum Verzeichnis DIR

67voto

Grizli Punkte 687

Die Option -C funktioniert; zur Klarstellung werde ich 2 Beispiele posten:

  1. Erstellung eines Tarballs ohne den vollständigen Pfad: vollständiger Pfad /home/testuser/workspace/project/application.war und was wir wollen ist nur project/application.war also:

    tar -cvf output_filename.tar  -C /home/testuser/workspace project

    Hinweis: Es gibt einen Leerzeichen zwischen workspace und project; tar wird den vollständigen Pfad durch nur project ersetzen.

  2. Extrahieren des Tarballs mit Änderung des Ziel-Pfads (Standard ist ., d.h. aktuelles Verzeichnis)

    tar -xvf output_filename.tar -C /home/deploy/

    tar wird den Tarball basierend auf dem angegebenen Pfad extrahieren und den Erstellungspfad beibehalten; in unserem Beispiel wird die Datei application.war nach /home/deploy/project/application.war extrahiert.

    /home/deploy: beim Extrahieren angegeben
    project: bei der Erstellung des Tarballs angegeben

Hinweis: Wenn Sie den erstellten Tarball in ein Zielverzeichnis platzieren möchten, fügen Sie einfach den Ziel-Pfad vor dem Tarball-Namen hinzu. z.B.:

tar -cvf /path/to/place/output_filename.tar  -C /home/testuser/workspace project

23voto

Scheint, dass die Option -C bis tar v2.8.3 nicht konsistent auf allen Plattformen (Betriebssystemen) funktioniert. Die -C-Option soll ein Verzeichnis zum Archiv hinzufügen, aber auf Mac und Ubuntu wird ein absoluter Pfadpräfix innerhalb der generierten tar.gz-Datei hinzugefügt.

tar ziel_pfad/datei.tar.gz -C quelle_pfad/quell_verzeichnis

Daher ist die konsistente und robuste Lösung, in das quelle_pfad (übergeordnete Verzeichnis von quelle_verzeichnis) zu navigieren und auszuführen

tar ziel_pfad/datei.tar.gz quelle_verzeichnis

oder

tar -cf ziel_pfad/datei.tar.gz quelle_verzeichnis

in Ihrem Skript. Dadurch wird das absolute Pfadpräfix in der Verzeichnisstruktur Ihrer generierten tar.gz-Datei entfernt.

18voto

laktak Punkte 52075

Eine kleine Anmerkung:

tar -cjf site1.tar.bz2 -C /var/www/site1 .

fügt die Dateien als

tar -tf site1.tar.bz2
./style.css
./index.html
./page2.html
./page3.html
./images/img1.png
./images/img2.png
./subdir/index.html

Wenn du wirklich willst

tar -tf site1.tar.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html

Solltest du entweder

  • zuerst in das Verzeichnis wechseln
  • oder ausführen

    tar -cjf site1.tar.bz2 -C /var/www/site1 $(ls -A /var/www/site1)

Beachte jedoch, dass dies Leerzeichen nicht unterstützt. Danke an @dragon788 und @Fonic.

13voto

WLatif Punkte 1330

Der folgende Befehl erstellt ein Stammverzeichnis "." und fügt alle Dateien aus dem angegebenen Verzeichnis darin ein.

tar -cjf site1.tar.bz2 -C /var/www/site1 .

Wenn Sie alle Dateien im Stammverzeichnis der Tar-Datei platzieren möchten, hat @chinthaka recht. Gehen Sie einfach in das Verzeichnis und führen Sie Folgendes aus:

tar -cjf zielpfad/datei.tar.gz *

Dadurch werden alle Dateien im aktuellen Arbeitsverzeichnis in die Tar-Datei als Stammdateien platziert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X