it-swarm.com.de

Erstellen Sie ein Verzeichnis, speichern Sie jedoch keine vollständigen absoluten Pfade im Archiv

Ich habe den 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

Ich möchte jedoch den Teil /var/www/site1 aus den Verzeichnis- und Dateinamen im Archiv entfernen, um die Extraktion zu vereinfachen und eine unnötige konstante Verzeichnisstruktur zu vermeiden. Nie weiß ich, falls ich Backup-Websites an einem Ort extrahieren würde, an dem keine Webdaten unter /var/www gespeichert wurden.

Für das obige Beispiel hätte ich gerne:

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

Wenn ich also extrahiere, werden die Dateien im aktuellen Verzeichnis extrahiert, und ich muss die extrahierten Dateien danach nicht mehr verschieben. Dadurch bleiben die Verzeichnisstrukturen erhalten.

Es gibt bereits viele Fragen zu tar und zum Backup in stackoverflow und an anderen Stellen im Web, aber die meisten von ihnen verlangen, dass die gesamte Unterverzeichnisstruktur gelöscht wird (Abflachung), oder Sie müssen nur das ursprüngliche/in den Namen hinzufügen oder entfernen (ich ziehe weiß nicht, was sich beim Extrahieren genau ändert), aber nicht mehr.

Nachdem ich einige der hier und dort gefundenen Lösungen sowie das Handbuch gelesen hatte, versuchte ich:

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 arbeitete so, wie ich es wollte. Einige tun nichts, andere archivieren keine Unterverzeichnisse mehr.

Es befindet sich in einem Backup-Shell-Skript, das von einem Cron gestartet wurde. Ich weiß nicht genau, von welchem ​​Benutzer es ausgeführt wird, wie der Pfad und das aktuelle Verzeichnis sind. Daher ist es für alle erforderlich, den absoluten Pfad zu schreiben, und das aktuelle Verzeichnis nicht zu ändern um zu vermeiden, dass das Skript weiter bricht (da nicht nur Websites, sondern auch Datenbanken gesichert werden, senden Sie dann alles an FTP usw.)

Wie kann ich das erreichen?

Habe ich gerade missverstanden, wie die Option -C funktioniert?

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

Im obigen Beispiel wechselt tar in das Verzeichnis /var/www/site1, bevor es seine Aktion ausführt, da die Option -C /var/www/site1 angegeben wurde.

Von man tar:

OTHER OPTIONS

  -C, --directory DIR
       change to directory DIR
264
Lars Brinkhoff

Die Option -C funktioniert; Nur zur Verdeutlichung 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 so:

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

    Hinweis: Zwischen workspace und project gibt es ein Leerzeichen. tar ersetzt den vollständigen Pfad nur mit project.

  2. extraktion von Tarball mit Änderung des Zielpfads (Standardeinstellung ., d. h. aktuelles Verzeichnis)

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

    tar extrahiert Tarball basierend auf dem angegebenen Pfad und behält den Erstellungspfad bei; In unserem Beispiel wird die Datei application.war nach /home/deploy/project/application.war extrahiert.

    /home/deploy: als Auszug angegeben
    project: wird bei der Erstellung des Tarballs angegeben

Hinweis: Wenn Sie das erstellte Tarball in ein Zielverzeichnis einfügen möchten, fügen Sie einfach den Zielpfad vor dem Tarball-Namen hinzu. z.B.: 

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

Die -C-Option bis tar v2.8.3 scheint nicht auf allen Plattformen (Betriebssystemen) konsistent zu sein. Die -C-Option fügt dem Archiv ein Verzeichnis hinzu, fügt jedoch unter Mac und Ubuntu das absolute Präfix in der generierten tar.gz-Datei hinzu.

tar target_path/file.tar.gz -C source_path/source_dir

Daher ist die konsistente und robuste Lösung, cd in source_path (übergeordnetes Verzeichnis von source_dir) einzugeben und auszuführen 

tar target_path/file.tar.gz source_dir

oder

tar -cf target_path/file.tar.gz source_dir

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

Der folgende Befehl erstellt ein Stammverzeichnis "." und legen Sie alle Dateien aus dem angegebenen Verzeichnis hinein.

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

Wenn Sie alle Dateien im Stammverzeichnis der tar-Datei ablegen möchten, ist @chinthaka richtig. Einfach cd in das Verzeichnis einlegen und tun:

tar -cjf target_path/file.tar.gz *

Dadurch werden alle Dateien in der cwd-Datei als Root-Dateien in die tar-Datei eingefügt.

4
WLatif

Die Verwendung des "Punktes" führt zur Erstellung eines Ordners mit dem Namen "Punkt" (auf Ubuntu 16).

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

Ich habe mich ausführlicher damit beschäftigt und ein Beispiel angefertigt. Mehrzeilige Aufnahme plus eine Ausnahme.

tar -tf site1.bz2\
    -C /var/www/site1/ style.css\
    -C /var/www/site1/ index.html\
    -C /var/www/site1/ page2.html\
    -C /var/www/site1/ page3.html\
    --exclude=images/*.Zip\
    -C /var/www/site1/ images/
    -C /var/www/site1/ subdir/
/
0
Sergey Asachev

Wenn Sie ein Unterverzeichnis archivieren und das Unterverzeichnispfad anpassen möchten, ist dieser Befehl nützlich:

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