Antworten:
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-Tars haben die --strip-components
Option, 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
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_name
Verzeichnis gibt. Übrigens liegt Schönheit im Auge des Betrachters.
Wenden Sie mit GNU tar ≥1.16 --transform
eine 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_name
es 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!'
pax
Verwenden Sie mit dem POSIX-Archivierungsdienstprogramm die -s
Option, 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!'
Benutze das :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&
Listenoperators zwischen diesen beiden Befehlen, sodass der zweite nur ausgeführt wird, wenn der erste erfolgreich war.
ugly_name
vorhanden ist.
Einfachster Weg
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_name
ohne gepostet hat--strip-components 1
. (2) Im Gegensatz dazu die akzeptierte Antwort (veröffentlicht von Mat) gehört --strip-components 1
ohne --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.
--strip-component 1
ist erforderlich, entweder mit der Methode mkdir
oder --strip-components 1
, sonst bekommt man eben pretty_name/ugly_name/
.
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 .
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 1
dass 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.
pretty_name
mit dem Namen erstellt wird , in der sich das ursprüngliche Verzeichnis der obersten Ebene befindet. Wenn Sie beispielsweise tar xzf ugly_name.tgz
ein Verzeichnis mit dem Namen erstellen würden, würde ugly_name/
der von Ihnen angegebene Befehl erstellt pretty_name/ugly_name/
.