Réponses:
Cela devrait fonctionner:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-Cmodifications apportées au répertoire spécifié avant le déballage (ou l’emballage). --strip-componentssupprime le nombre spécifié de répertoires des noms de fichiers stockés dans l'archive.
Notez que ce n'est pas vraiment portable. GNU tar et au moins certains des goudrons BSD ont l' --strip-componentsoption, mais ne semblent pas exister sur d'autres plates-formes de type Unix.
La façon idiote de faire cela fonctionnerait un peu partout cependant.
tar xf ugly_name.tar && mv ugly_name pretty_name
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_namerépertoire. À propos, la beauté est dans l'œil du spectateur.
Avec GNU tar ≥1.16, utilisez --transformpour appliquer une transformation sed regexp à chaque nom de fichier (la transformation est appliquée sur le chemin complet de l’archive):
tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'
Si ugly_nameest le composant de niveau supérieur de tous les noms de fichiers de l'archive, inutile de vous préoccuper de la correspondance exacte:
tar xf foo.tar --transform 's/ugly_name/pretty_name/'
Si vous ne connaissez pas le nom du répertoire de niveau supérieur, vous pouvez toujours utiliser cette méthode, mais vous préférerez peut-être --strip-componentsplutôt.
tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'
Avec paxl’utilitaire d’archive POSIX, utilisez l’ -soption, qui prend comme argument une expression de remplacement semblable à sed.
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!'
Utilisez ceci :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&opérateur de liste entre ces deux commandes. Ainsi, la seconde ne sera exécutée que si la première a réussi.
ugly_nameexiste déjà.
Manière la plus simple
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_namesans --strip-components 1. (2) Inversement, la réponse acceptée (publiée par Mat) est --strip-components 1sans --one-top-level=pretty_name. (3) Pouvez-vous expliquer pourquoi votre réponse, combinant ces options, est meilleure que les plus anciennes? S'il vous plaît ne répondez pas dans les commentaires; éditez votre réponse pour la rendre plus claire et plus complète.
--strip-component 1est requis, avec la méthode mkdirou --strip-components 1, sinon vous obtenez simplement pretty_name/ugly_name/.
De askUbuntu, cette réponse a fonctionné pour moi:
tar zxvf ugly_name.tgz --one-top-level=pretty_name
`--one-top-level [= dir] '
Indique à tar de créer un nouveau répertoire sous le répertoire d'extraction (ou celui transmis à «-C») et de l'utiliser pour se protéger des tarbombs. En l'absence d'argument dir, le nom du nouveau répertoire sera égal au nom de base de l'archive (nom du fichier moins le suffixe de l'archive, s'il est reconnu). Tous les noms de membres qui ne commencent pas par ce nom de répertoire (après les transformations de `--transform 'et` --strip-components') en seront préfixés. Les suffixes de nom de fichier reconnus sont «.tar», et tous les suffixes de compression sont reconnaissables par See -auto-compress .
Comme indiqué dans les commentaires , cette méthode ne fonctionne pas pour les archives correctement formées. Toutefois, comme l' indique une autre réponse , vous devez ajouter --strip-components 1pour que cela fonctionne réellement. J'ai testé avec cette nouvelle option et cela fonctionne à la fois pour les archives avec un nom de premier niveau et celles sans.
pretty_name, avec le répertoire de niveau supérieur d'origine à l'intérieur. Par exemple, si tar xzf ugly_name.tgzcréer un répertoire appelé ugly_name/, la commande que vous avez fournie créerait pretty_name/ugly_name/.