Ich habe den folgenden Befehl im Teil eines Backup-Shell-Skripts:
tar -cjf site1.bz2 /var/www/site1/
Wenn ich den Inhalt des Archivs aufführe, 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 das Teil jedoch /var/www/site1
aus den Verzeichnis- und Dateinamen im Archiv entfernen , um die Extraktion zu vereinfachen und eine nutzlose konstante Verzeichnisstruktur zu vermeiden. Nie wissen, falls ich gesicherte Websites an einem Ort extrahieren würde, unter dem Webdaten nicht gespeichert wurden /var/www
.
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 Dateien im aktuellen Verzeichnis extrahiert, und ich muss die extrahierten Dateien danach nicht mehr verschieben, sodass die Unterverzeichnisstrukturen erhalten bleiben.
Es gibt bereits viele Fragen zu Tar und Backup in stackoverflow
und an anderen Stellen im Web, aber die meisten fragen nach dem Löschen der gesamten Unterverzeichnisstruktur (Abflachen) oder einfach nach dem Hinzufügen oder Entfernen der Initialen / in den Namen (ich weiß nicht) Ich weiß nicht genau, was sich beim Extrahieren ändert, aber nicht mehr.
Nachdem ich einige der hier und da 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 hat so funktioniert, wie ich es will. Einige tun nichts, andere archivieren keine Unterverzeichnisse mehr.
Es befindet sich in einem Backup-Shell-Skript, das von einem Cron gestartet wurde. Daher weiß ich nicht genau, welcher Benutzer es ausführt, wie der Pfad und das aktuelle Verzeichnis lauten. Daher ist für alles immer das Schreiben eines absoluten Pfads erforderlich, und ich würde es vorziehen, das aktuelle Verzeichnis nicht zu ändern um zu vermeiden, dass das Skript weiter beschädigt wird (da nicht nur Websites, sondern auch Datenbanken gesichert und dann an FTP usw. gesendet werden)
Wie erreicht man das?
Habe ich gerade falsch verstanden, wie die Option -C funktioniert?
-C
bedeutet nur "Verzeichnis wechseln", während das Ersetzen eines Pfads (oder eines Präfixes) nur durch erfolgen kann--transform
. rif. superuser.com/questions/595510/prepend-prefix-in-tar/595512 Sie können einfach -C (Verzeichnis ändern) und --transformieren: `` `tar cjf site1.bz2 --transform" s / ^ \. \ // $ targetbase / "-C / var / www / site1. `` `Antworten:
Im obigen Beispiel wechselt tar
/var/www/site1
vor der Ausführung des Vorgangs-C /var/www/site1
in das Verzeichnis , da die Option angegeben wurde.Von
man tar
:quelle
tar
an, alles im aktuellen Verzeichnis zu archivieren. Und-C
legt das aktuelle Verzeichnis fest.tar -czvf site1.tar.gz -C /var/www/ site1
(Beachten Sie den Speicherplatz, ich verwende immer noch -C, um in das übergeordnete Verzeichnis zu cd und das Verzeichnis zu tar anzugeben anstelle von Punkt)./folders
wie kann dieser entfernt werden?Die Option
-C
funktioniert; Nur zur Verdeutlichung werde ich 2 Beispiele posten:Schaffung eines Tarballs ohne den vollen Weg: voller Weg
/home/testuser/workspace/project/application.war
und was wir wollen, ist einfachproject/application.war
so:Hinweis: Zwischen
workspace
und befindet sich ein Leerzeichenproject
. Teer ersetzt den vollständigen Pfad durch nurproject
.Extraktion von Tarball mit Änderung des Zielpfads (Standard auf
.
, dh aktuelles Verzeichnis)tar
extrahiert Tarball basierend auf dem angegebenen Pfad und behält den Erstellungspfad bei; In unserem Beispiel wird die Dateiapplication.war
in extrahiert/home/deploy/project/application.war
./home/deploy
: gegeben auf Auszugproject
: gegeben bei der Erstellung von TarballHinweis: Wenn Sie den erstellten Tarball in einem Zielverzeichnis ablegen möchten, fügen Sie einfach den Zielpfad vor dem Namen des Tarballs hinzu. z.B:
quelle
Die
-C
Option bis tar v2.8.3 scheint nicht auf allen Plattformen (Betriebssystemen) konsistent zu funktionieren.-C
Die Option soll dem Archiv ein Verzeichnis hinzufügen, aber unter Mac und Ubuntu wird das absolute Pfadpräfix in der generierten tar.gz-Datei hinzugefügt.Daher besteht die konsistente und robuste Lösung darin,
cd
in source_path (übergeordnetes Verzeichnis von source_dir) einzutreten und auszuführenoder
in Ihrem Skript. Dadurch wird das absolute Pfadpräfix in der Verzeichnisstruktur Ihrer generierten tar.gz-Datei entfernt.
quelle
-cvf
hinzugefügtemtar
Nachher), stelle ich fest, dass die resultierende tar.gz-Datei keine absoluten Pfade enthält, was mit mehreren anderen Antworten übereinstimmt. Wenn Sie der Meinung sind, dass Teer auf beiden Systemen, die ich zum Testen verwendet habe, defekt oder veraltet ist, verlinken Sie bitte auf eine Dokumentation, die Ihre Antwort unterstützen würde. Ich denke, die-C
Option wechselt das Verzeichnis vor der Ausführung (wie in anderen Antworten). Wenn ich es weglasse, versucht tar, Junk von hinzuzufügen./
, einschließlich Pfaden von ab./
.cd
zunächst. Ihre Antwort besagt, dass das Tool anders funktioniert als in den Dokumenten und auf meinem System. Es ist also eine falsche Antwort. Sie könnten es leicht beheben.Der folgende Befehl erstellt ein Stammverzeichnis "." und legen Sie alle Dateien aus dem angegebenen Verzeichnis darin ab.
Wenn Sie alle Dateien im Stammverzeichnis der TAR-Datei ablegen möchten, ist @chinthaka richtig. CD einfach in das Verzeichnis und mache:
Dadurch werden alle Dateien im CWD als Root-Dateien in die TAR-Datei eingefügt.
quelle
Die Verwendung des "Punkts" führt zur Erstellung eines Ordners mit dem Namen "Punkt" (unter Ubuntu 16).
Ich habe mich ausführlicher damit befasst und ein Beispiel vorbereitet. Mehrzeilige Aufnahme plus eine Ausnahme.
quelle
.
das aktuelle Verzeichnis. Im Kontext dertar.gz
Struktur des 's ist das nur die Basis / Wurzel / oberste Ebene, oder?Wenn Sie ein Unterverzeichnis archivieren und den Unterverzeichnispfad kürzen möchten, ist dieser Befehl hilfreich:
quelle