web-dev-qa-db-fra.com

Comment choisir le nom du répertoire pendant le découplage

Dites que j'ai un fichier nommé ugly_name.tar, qui une fois extrait, devient ugly_name répertoire. Quelle commande puis-je utiliser pour que le nom du répertoire résultant soit pretty_name au lieu?

132
tshepang

Cela devrait fonctionner:

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

-C modifie le répertoire spécifié avant de déballer (ou emballer). --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 le --strip-components option, mais ne semble pas exister sur d'autres plateformes de type Unix.

La façon stupide de faire cela fonctionnerait à peu près partout cependant.

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

Avec GNU tar ≥1.16, utilisez --transform pour appliquer une transformation regexp sed à 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 dans l'archive, vous n'avez pas besoin de vous soucier d'une correspondance précise:

tar xf foo.tar --transform 's/ugly_name/pretty_name/'

Si vous ne connaissez pas le nom du répertoire de haut niveau, vous pouvez toujours utiliser cette méthode, même si vous préférez --strip-components à la place.

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

Avec pax , l'utilitaire d'archivage POSIX, utilisez le -s option, qui prend une expression de remplacement de type sed comme argument.

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

Manière la plus simple

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

Utilisez ceci :

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

De askUbuntu, cela 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 passé à "-C") et de l'utiliser pour se prémunir contre les bombes tarbomb. En l'absence d'argument dir, le nom du nouveau répertoire sera égal au nom de base de l'archive (nom de 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') seront préfixés avec lui. Les suffixes de nom de fichier reconnus sont `.tar ', et tout suffixe de compression reconnaissable par See - auto-compress .


Mise à jour

Comme indiqué dans commentaires , cette méthode ne fonctionne pas pour les archives correctement formées, mais comme ne autre réponse le montre, vous devez ajouter --strip-components 1 pour que cela fonctionne vraiment. J'ai testé avec cette nouvelle option et cela fonctionne à la fois pour les archives avec un nom de haut niveau et celles sans.

3
smac89