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. `` `