Geben Sie das Root-Verzeichnis im Tarball an


7

Gibt es eine Möglichkeit zur Ausführung?

tar cjvf foo.tar.bz2 project-root

Wenn der Tarball extrahiert wird, wird er nicht in Project-Root extrahiert, sondern in etwas anderes? dh

tar xjvf foo.tar.bz2
cd something-else
# see all files that were within original project-root

Ich bin mir von -C bewusst, aber ich möchte es so, dass etwas anderes noch nicht existiert.


Das heißt, der extrahierende Benutzer sollte nicht wissen müssen, was etwas anderes sein sollte (dh mkdir it), es ist der komprimierende Benutzer, der es angibt.
Pistos

Es hört sich so an, als würden Sie fragen: "Wenn der Benutzer das gesamte Archiv extrahiert, erstellen Sie ein Projektstamm-Unterverzeichnis. Wenn der Benutzer nur einen Teil des Archivs extrahiert, rufen Sie das Unterverzeichnis etwas anderes auf." Wenn nicht, benennen Sie das Verzeichnis zunächst etwas anderes.
Stephen Jennings

Stellen Sie sich vor, das ursprüngliche Verzeichnis heißt project / und ich möchte Tarballs für project-0.1, project-0.2 usw. erstellen. Das Umbenennen des Verzeichnisses scheint nicht optimal zu sein. Es wäre besser als Option für Teer geeignet.
Pistos

Ja. Was Sie sprechen, grenzt an "Versionskontrolle" und liegt etwas außerhalb tardes Geltungsbereichs (weshalb es keine Option dafür gibt). Wenn Sie ein Projekt haben und eine Punktfreigabe vornehmen möchten, verwenden Sie im Allgemeinen Ihre Versionskontrolltools, um bestimmte Versionen bestimmter Dateien als Projekt v0.1 oder v0.2 usw. festzulegen, und überprüfen Sie dann die v0.1-Dateien auf ein neues Verzeichnis Projekt-0.1 , tar dieses Verzeichnis und tahdaaaah, fertig.
Quacksalber Quijote

Antworten:


4

Erstellen Sie zuerst einen Symlink und lassen Sie den Teer folgen.

ln -s project-root something-else
tar cjf foo.tar.bz2 something-else/*
rm something-else

Das /*ist notwendig, um dem Link zu folgen und alle Inhalte auszuwählen, anstatt nur den Symlink selbst zu teern. Sie können alternativ die -hOption auf GNU tar (aber dies folgt auch Links im Inneren, die Sie möglicherweise nicht möchten) oder die HOption auf BSD tar (wie auf einem Mac) verwenden.

Sie können dies sogar innerhalb von project-root tun:

cd project-root
ln -s . something-else
tar cjf foo.tar.bz2 --exclude=something-else/something-else something-else/*
rm something-else

Sofern Sie dies nicht ausdrücklich ausschließen (wie oben), ist der Symlink auch im Tarball vorhanden.

Wenn Sie dies häufig tun und den herumhängenden Symlink nicht stören, muss er natürlich nicht jedes Mal gelöscht und neu erstellt werden.


2

Sie können Project-Root innerhalb des Tarballs mit der 7-Zip-GUI (und wahrscheinlich auch anderen Archivierungsprogrammen) umbenennen. Dies kann jedoch einen vollständigen Dekomprimierungs- / Rekomprimierungszyklus für komprimierte Tarballs durchführen. (Lesen Sie: Dies kann bei großen, stark komprimierten Tarballs eine Weile dauern.)

Der beste Weg, um das zu tun, was Sie wollen, besteht darin, den Namen zu ändern, bevor Sie den Tarball erstellen. Eine einfache Möglichkeit wäre, die Projektwurzel vorübergehend in etwas anderes umzubenennen :

# temporary rename; tar; restore original name
$ mv project-root something-else ; tar cjf foo.tar.bz2 something-else ; mv something-else project-root

Ich würde wahrscheinlich etwas komplizierter werden: Machen Sie eine Kopie mit dem Namen, den ich im Tarball haben möchte. Dies vermeidet potenzielle Fehler oder verpasste Schritte in einem späteren Fix-it-up-Prozess, und ich möchte möglicherweise beide Kopien für andere Zwecke aufbewahren.

# make me a copy
$ ( cd project-root ; tar cf - . ) | ( mkdir something-else; cd something-else; tar xf - )

# test the copy here if needed
$ diff -r --brief project-root/ something-else/

# create my tarball
$ tar cjf foo.tar.bz2 something-else

Hinweis: Wenn Sie nach dieser Funktionalität als Mittel zur Versionskontrolle bei schlechtem Personal suchen, möchten Sie wahrscheinlich trotzdem eine separate Kopie Ihrer Punktversion aufbewahren.
Quacksalber Quijote

Tolle Antwort (en); Vielen Dank. In der Tat mache ich gerade eine Bash-Kette mit mehreren Befehlen, um zu komprimieren, zu dekomprimieren, umzubenennen und neu zu komprimieren. Ihr "Teer vgl. -" Die Lösung sieht allerdings etwas besser aus.
Pistos

Sie könnten wahrscheinlich das gleiche mit " cp -a project-root something-else" tun . Ich greife einfach automatisch nach dem "Teer cf -". Einzeiler, wenn ich Verzeichnisbäume kopieren muss. Ich benutze es so lange, dass ich mich nicht erinnern kann, warum - könnte etwas damit zu tun haben, dass ich nicht alle Optionen verstanden habe cp. Der Einzeiler ist so kompliziert, dass ich tar cf . -
aufpassen

Gute Antwort. Vielleicht begann die tar -cf - .Sache mit der Datenübertragung zwischen Maschinen? von der Art tar cf - . | rsh dest.foo.net 'cd /dest/dir && tar xf -'?
DaveParillo

@ Dave: Sicher, vielleicht. es hat mich sicherlich in die Macht der Verkettung von Befehlen eingeführt.
Quacksalber Quijote
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.