Comment choisir le nom du répertoire pendant la décompression


124

Disons que j'ai un fichier nommé ugly_name.tarqui, une fois extrait, devient un ugly_namerépertoire. Quelle commande puis-je utiliser pour que le nom du répertoire résultant soit à la pretty_nameplace?

Réponses:


171

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

Je pense que je vais rester avec la version muette :)
Phunehehe

28
@phunehehe: l'un des avantages de la version intelligente est qu'il n'est pas nécessaire de savoir à l'avance quel est le nom du répertoire sans
barre

2
Puis-je ajouter que cela fonctionne pour plus que "Pretty_name". Vous pouvez également décompresser dans un répertoire spécifique de cette façon. Exemple:tar -xvf /tmp/backupfiles.tar -C /var/www/
Général Redneck

2
J'utilise habituellement la méthode idiote, et j'utilise des caractères génériques au cas où je ne saurais pas quel sera le nom moche ou si je ne veux pas l'écrire. mv ugly-* pretty_name
David Grayson

1
La manière stupide ne fonctionne pas s'il y a déjà un ugly_namerépertoire. À propos, la beauté est dans l'œil du spectateur.
kmiklas

30

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!'

9

Utilisez ceci :

tar -xvf ugly_name.tar
mv ugly_name pretty_name

9
Vous préférerez peut-être utiliser l' &&opérateur de liste entre ces deux commandes. Ainsi, la seconde ne sera exécutée que si la première a réussi.
manatwork

1
Cela pourrait avoir des conséquences indésirables si un répertoire ugly_nameexiste déjà.
Drew Dormann

7

Manière la plus simple

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

(1) Ce n'est clairement pas la façon la plus simple, car smac89 a posté une réponse avec --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.
G-Man

peut-être qu'un exemple réel peut vous aider à clarifier: `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

Cette réponse est plus élégante que celle avec le vote le plus élevé .
KaiserKatze

@ G-Man --strip-component 1est requis, avec la méthode mkdirou --strip-components 1, sinon vous obtenez simplement pretty_name/ugly_name/.
David

C'est en effet la manière la plus simple
smac89

2

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 .


Mise à jour

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.


Le problème, c'est qu'il ne renomme pas le répertoire de niveau supérieur, mais crée un nouveau niveau, nommé 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/.
David

1
@davidA Bon point. J'ai mis à jour ma réponse pour y inclure un correctif
smac89
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.