So wählen Sie den Verzeichnisnamen beim Aufheben des Teers aus

125

Angenommen, ich habe eine Datei mit dem Namen ugly_name.tar, die beim Extrahieren zum ugly_nameVerzeichnis wird. Welchen Befehl kann ich verwenden, damit der resultierende Verzeichnisname pretty_namestattdessen lautet ?

Tshepang
quelle

Antworten:

172

Das sollte funktionieren:

mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1

-Cwechselt vor dem Entpacken (oder Packen) in das angegebene Verzeichnis. --strip-componentsEntfernt die angegebene Anzahl von Verzeichnissen aus den im Archiv gespeicherten Dateinamen.

Beachten Sie, dass dies nicht wirklich portabel ist. GNU tar und zumindest einige der BSD-Tars haben die --strip-componentsOption, scheinen aber auf anderen Unix-ähnlichen Plattformen nicht zu existieren.

Die blöde Art und Weise, das zu tun, würde jedoch so ziemlich überall funktionieren.

tar xf ugly_name.tar && mv ugly_name pretty_name
Matte
quelle
Ich denke, ich bleibe bei der
blöden
28
@phunehehe: Ein Vorteil der Smart-Version ist, dass Sie nicht im Voraus wissen müssen, wie der nicht geteerte Verzeichnisname lautet
tshepang
2
Darf ich hinzufügen, dass dies für mehr als "Pretty_name" funktioniert. Sie können auf diese Weise auch die Markierung eines bestimmten Verzeichnisses aufheben. Beispiel:tar -xvf /tmp/backupfiles.tar -C /var/www/
General Redneck
2
Ich benutze normalerweise die blöde Art und Weise, und ich verwende Platzhalter, falls ich nicht weiß, wie der hässliche Name lauten wird oder ich es nicht aufschreiben möchte. mv ugly-* pretty_name
David Grayson
1
Blödsinn funktioniert nicht, wenn es bereits ein ugly_nameVerzeichnis gibt. Übrigens liegt Schönheit im Auge des Betrachters.
kmiklas
30

Wenden Sie mit GNU tar ≥1.16 --transformeine sed regexp-Transformation auf jeden Dateinamen an (die Transformation wird auf den vollständigen Pfad im Archiv angewendet):

tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'

Wenn ugly_namees sich bei allen Dateinamen im Archiv um die oberste Ebene handelt, müssen Sie sich nicht um eine genaue Zuordnung kümmern:

tar xf foo.tar --transform 's/ugly_name/pretty_name/'

Wenn Sie den Namen des Toplevel-Verzeichnisses nicht kennen, können Sie diese Methode trotzdem verwenden, obwohl Sie dies möglicherweise vorziehen --strip-components.

tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'

paxVerwenden Sie mit dem POSIX-Archivierungsdienstprogramm die -sOption, die einen sed-ähnlichen Ersetzungsausdruck als Argument verwendet.

pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'
Gilles
quelle
9

Benutze das :

tar -xvf ugly_name.tar
mv ugly_name pretty_name
Rupesh Mande
quelle
9
Möglicherweise bevorzugen Sie die Verwendung eines &&Listenoperators zwischen diesen beiden Befehlen, sodass der zweite nur ausgeführt wird, wenn der erste erfolgreich war.
Manatwork
1
Dies kann unerwünschte Folgen haben, wenn bereits ein Verzeichnis ugly_namevorhanden ist.
Drew Dormann
7

Einfachster Weg

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
Marquicus
quelle
(1) Dies ist eindeutig nicht der einfachste Weg, da smac89 eine Antwort mit --one-top-level=pretty_nameohne gepostet hat--strip-components 1 . (2) Im Gegensatz dazu die akzeptierte Antwort (veröffentlicht von Mat) gehört --strip-components 1ohne --one-top-level=pretty_name. (3) Können Sie erklären, warum Ihre Antwort, wenn Sie diese Optionen kombinieren, besser ist als eine der älteren? Bitte antworten Sie nicht in Kommentaren; Bearbeiten Sie  Ihre Antwort, um sie klarer und vollständiger zu gestalten.
G-Man
Vielleicht hilft Ihnen ein reales Beispiel bei der Klärung: `wget dev.mysql.com/get/Downloads/MySQL-5.7/… tar xvf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz --one-top -level = mysql57 --strip-components 1 `
marquicus
Diese Antwort ist eleganter als die mit der höchsten Zustimmung .
KaiserKatze
@ G-Man --strip-component 1ist erforderlich, entweder mit der Methode mkdiroder --strip-components 1, sonst bekommt man eben pretty_name/ugly_name/.
DavidA
Dies ist in der Tat der einfachste Weg
smac89
2

Von askUbuntu funktionierte diese Antwort für mich:

tar zxvf ugly_name.tgz --one-top-level=pretty_name

`--one-top-level [= dir] '

Weist tar an, ein neues Verzeichnis unterhalb des Extraktionsverzeichnisses (oder des an -C übergebenen Verzeichnisses) zu erstellen und es zum Schutz vor Tarbombs zu verwenden. Wenn das Argument dir fehlt, entspricht der Name des neuen Verzeichnisses dem Basisnamen des Archivs (Dateiname abzüglich des Archivsuffixes, falls erkannt). Allen Mitgliedsnamen, die nicht mit diesem Verzeichnisnamen beginnen (nach Transformationen von --transform und --strip-components), wird ein Präfix vorangestellt. Erkannte Dateinamensuffixe sind `.tar 'und alle durch See -auto-compress erkennbaren Komprimierungssuffixe .


Aktualisieren

Wie in den Kommentaren erwähnt , funktioniert diese Methode nicht für Archive, die ordnungsgemäß erstellt wurden. Wie jedoch aus einer anderen Antwort hervorgeht , sollten Sie hinzufügen, --strip-components 1dass dies wirklich funktioniert. Ich habe diese neue Option getestet und sie funktioniert sowohl für Archive mit einem Namen der obersten Ebene als auch für Archive ohne.

smac89
quelle
Das Problem dabei ist, dass das Verzeichnis der obersten Ebene nicht umbenannt wird, sondern eine neue Ebene pretty_namemit dem Namen erstellt wird , in der sich das ursprüngliche Verzeichnis der obersten Ebene befindet. Wenn Sie beispielsweise tar xzf ugly_name.tgzein Verzeichnis mit dem Namen erstellen würden, würde ugly_name/der von Ihnen angegebene Befehl erstellt pretty_name/ugly_name/.
DavidA
1
@ DavidA Guter Punkt. Ich habe meine Antwort aktualisiert, um eine Lösung für dieses
Problem zu finden