it-swarm.com.de

So wählen Sie den Verzeichnisnamen beim Aufheben des Teers

Angenommen, ich habe eine Datei mit dem Namen ugly_name.tar, Die beim Extrahieren zum Verzeichnis ugly_name Wird. Welchen Befehl kann ich verwenden, damit der resultierende Verzeichnisname stattdessen pretty_name Lautet?

132
tshepang

Das sollte funktionieren:

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

-C wechselt vor dem Entpacken (oder Packen) in das angegebene Verzeichnis. --strip-components entfernt 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-Teere haben das --strip-components Option, scheint aber auf anderen Unix-ähnlichen Plattformen nicht zu existieren.

Die dumme Art, dies zu tun, würde allerdings fast überall funktionieren.

tar xf ugly_name.tar && mv ugly_name pretty_name
187
Mat

Verwenden Sie mit GNU tar ≥1.16 --transform , um eine sed regexp-Umwandlung auf jeden Dateinamen anzuwenden (die Umwandlung wird auf den vollständigen Pfad im Archiv angewendet):

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

Wenn ugly_name ist die oberste Komponente aller Dateinamen im Archiv. Sie müssen sich nicht um die 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 weiterhin verwenden, obwohl Sie möglicherweise --strip-components stattdessen.

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

Verwenden Sie mit pax , dem POSIX-Archivierungsdienstprogramm, das -s Option, die einen sed-ähnlichen Ersatzausdruck 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!'

Einfachster Weg

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
11
marquicus

Benutze das :

tar -xvf ugly_name.tar
mv ugly_name pretty_name
9
Rupesh Mande

Von askUbuntu hat diese Antwort für mich funktioniert:

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

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

Weist tar an, ein neues Verzeichnis unter dem Extraktionsverzeichnis (oder dem an `-C 'übergebenen) zu erstellen und es zum Schutz vor Tarbomben zu verwenden. Wenn kein dir-Argument vorhanden ist, entspricht der Name des neuen Verzeichnisses dem Basisnamen des Archivs (Dateiname abzüglich des Archivsuffix, falls erkannt). Allen Mitgliedsnamen, die nicht mit diesem Verzeichnisnamen beginnen (nach Transformationen von "--transform" und "--strip-components"), wird dieser vorangestellt. Erkannte Dateinamensuffixe sind ".tar" und alle Komprimierungssuffixe, die durch See - auto-compress erkennbar sind.


Aktualisieren

Wie in Kommentare ausgeführt, funktioniert diese Methode nicht für Archive, die ordnungsgemäß erstellt wurden. Wie eine andere Antwort zeigt, sollten Sie hierfür --strip-components 1 Hinzufügen wirklich arbeiten. Ich habe mit dieser neuen Option getestet und sie funktioniert sowohl für Archive mit einem Namen der obersten Ebene als auch für Archive ohne.

3
smac89