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?

5voto

Serhii Punkte 53

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

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

Ich habe das genauer betrachtet und ein Beispiel vorbereitet. 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/
/

3voto

Hirurg103 Punkte 4221

Wenn Sie ein Unterverzeichnis archivieren und den Unterverzeichnispfad kürzen möchten, ist dieser Befehl nützlich:

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

1voto

Juan Hernandez Punkte 2257
tar -cjf site1.tar.bz2 -C /var/www/site1 --strip-components 1 .

Dies ist eine Variation aller vorherigen Antworten, die ein tar mit dem folgenden Inhalt generiert:

style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html
  • Verwendung von -C, um das Verzeichnis zu ändern, bevor die Dateien hinzugefügt werden
  • Verwendung von --strip-components 1, um das führende ./ aus allen Einträgen zu entfernen

0voto

dexter2305 Punkte 1022

Gefunden tar -cvf site1-$seqNumber.tar -C /var/www/ site1 als freundlichere Lösung als tar -cvf site1-$seqNumber.tar -C /var/www/site1 . (Beachten Sie das . in der zweiten Lösung) aus folgenden Gründen

  • Der Dateiname des Tar-Archivs kann unbedeutend sein, da der ursprüngliche Ordner nun ein Archiv-Eintrag ist
  • Der Dateiname des Tar-Archivs kann jetzt unbedeutend für den Inhalt sein und für andere Zwecke wie Sequenznummern, periodische Backups usw. verwendet werden

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