Réponses:
Cela devrait fonctionner:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-C
modifications apportées au répertoire spécifié avant le déballage (ou l’emballage). --strip-components
supprime 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-components
option, 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_name
répertoire. À propos, la beauté est dans l'œil du spectateur.
Avec GNU tar ≥1.16, utilisez --transform
pour 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_name
est 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-components
plutôt.
tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'
Avec pax
l’utilitaire d’archive POSIX, utilisez l’ -s
option, 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_name
existe 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_name
sans --strip-components 1
. (2) Inversement, la réponse acceptée (publiée par Mat) est --strip-components 1
sans --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 1
est requis, avec la méthode mkdir
ou --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 1
pour 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.tgz
créer un répertoire appelé ugly_name/
, la commande que vous avez fournie créerait pretty_name/ugly_name/
.