Präfix in tar voranstellen

15

Ich mache derzeit in einem Shellscript sehr ineffizient:

cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION

Ich möchte, dass alles in dem Verzeichnis mit dem Namen $ VERSION enthalten ist. Gibt es eine Möglichkeit, dies zu tun, ohne alles wie im obigen Skript kopieren zu müssen?

Robby75
quelle
Warum es überhaupt kopieren? Warum nicht tar cjf archive.tar.bz2 $MYPATH?
Chewie
1
@Chewie hat er gesagt, er will die $ -Version als übergeordnetes Verzeichnis im Archiv haben.
Kent
Oh, ich sehe es jetzt.
Chewie

Antworten:

24

Die GNU-Version von tarunterstützt die --transformOption (und ihren Alias --xform), Sie könnten sie so verwenden

tar --transform "s/^$MYPATH/$VERSION/" -cf archive.tar.bz2 "$MYPATH"

Zum Beispiel angesichts dieses Verzeichnisbaums

foo
└── foo.txt

der Befehl

tar --transform "s/^foo/bar/" -cf foo.tar.bz2 foo

erzeugt ein Archiv wie

$ tar -tf foo.tar.bz2
bar/
bar/foo.txt
toro2k
quelle
3
Es ist bemerkenswert, dass dieser Ansatz symbolische Verknüpfungen unterbrechen kann. Das Voranstellen flags=r;löst das Problem wie in stackoverflow.com/a/29661783/388803 erwähnt .
Eregon
Fügen Sie keinen abschließenden Schrägstrich ein. Wenn ich einen abschließenden Schrägstrich in die Transformation einfüge, wird das ursprüngliche Präfix übersehen. ZB s/^a\//b\//zeigt das tar -tnoch, a/während alle anderen Dateien unter sind b/; Ich gehe davon aus, dass dies gefährlich ist, und ich muss mich nicht wirklich vor einer anderen Datei mit demselben Präfix schützen, die kein Verzeichnis in der TAR-Datei ist. Damit kein abschließender Schrägstrich in Ordnung ist, würde es mir nichts ausmachen, zu wissen, wie man den Fall der a/Transformation am besten handhabt , aber nicht, aa/wenn es ein Geschwister des Wurzelknotens wäre.
ThorSummoner
14

Um das aktuelle Verzeichnis zu tarieren und ein Präfix hinzuzufügen, funktionierte dies für mich:

tar --transform 's,^\.,$VERSION,' -cf foo.tar .
Andy Bileam
quelle
0

Wenn Sie davonkommen können, ohne die symbolischen Verknüpfungen innerhalb des Dateibaums, den Sie tarieren, beizubehalten, können Sie dies tun

ln -s $MYPATH /tmp/$VERSION
cd /tmp
tar cjhf archive.tar.bz2 $VERSION

Die hOption bedeutet, dass Symlinks dereferenziert werden, dh die Datei oder das Verzeichnis enthalten, auf die bzw. das der Link verweist, anstatt nur die Tatsache aufzuzeichnen, dass ein Symlink vorhanden war und auf was dieser verweist.

Ian Roberts
quelle