Disons que j'ai un fichier nommé ugly_name.tar
qui, une fois extrait, devient un ugly_name
répertoire. Quelle commande puis-je utiliser pour que le nom du répertoire résultant soit à la pretty_name
place?
124
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):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: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.Avec
pax
l’utilitaire d’archive POSIX, utilisez l’-s
option, qui prend comme argument une expression de remplacement semblable à sed.la source
Utilisez ceci :
la source
&&
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
la source
--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éthodemkdir
ou--strip-components 1
, sinon vous obtenez simplementpretty_name/ugly_name/
.De askUbuntu, cette réponse a fonctionné pour moi:
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 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.la source
pretty_name
, avec le répertoire de niveau supérieur d'origine à l'intérieur. Par exemple, sitar xzf ugly_name.tgz
créer un répertoire appeléugly_name/
, la commande que vous avez fournie créeraitpretty_name/ugly_name/
.