833 votes

Comment extraire des fichiers vers un autre répertoire à l'aide de la commande 'tar' ?

Je pensais tar archive.tar /users/mylocation devrait fonctionner, mais ce n'est pas le cas. Comment puis-je le faire ?

2 votes

Aussi, -C, --directory DIR\n change to directory DIR devrait plutôt être décrite comme change output directory to DIR (will fail if DIR doesn't exist) . Merci @Mich. Voir aussi la réponse de @Bryan_Larsen.

2 votes

@Ujjwal Sing : En effet, la page de manuel tar n'est pas très utile. Elle décrit "-C DIR" comme "change to directory DIR" . Pire encore : "tar -C mydir xf archive.tar" ne fonctionne pas, alors que "tar xf archive.tar -C mydir" fonctionne.

0 votes

@PatMorin Pour être juste, une fois que vous comprenez les conventions d'appel d'arguments que vous utilisez, cela a du sens. Vous pouvez également faire tar xfC archive.tar mydir o tar -C mydir -xf archive.tar . C'est seulement le mélange des drapeaux de style traditionnel et de style GNU qui casse les choses, comme... c'est honnêtement attendu. Les drapeaux traditionnels sont passés comme un seul blob en premier argument. Vous ne pouvez pas vous attendre à ce qu'ils fonctionnent s'ils ne sont pas les premiers. (Je veux dire, oui, il est possible de l'interpréter de toute façon - mon point de vue est que ce serait au-dessus et au-delà, pas standard).

1160voto

Wesley Rice Points 11996

Pour extraire une archive dans un répertoire différent du répertoire courant, utilisez la fonction -C ou --directory L'option tar, comme dans

tar -xf archive.tar -C /target/directory

Notez que le répertoire cible doit exister avant d'exécuter cette commande (il peut être créé par mkdir /target/directory ).

Lire l'article page de manuel (commande : man tar ) pour d'autres options.

0 votes

Le chemin d'accès peut-il être supprimé, c'est-à-dire qu'il suffit de récupérer le fichier ?

3 votes

S'il s'agit d'un fichier plus volumineux, lorsque vous exécutez la commande, vous n'obtenez aucune sortie pendant plusieurs secondes, voire plusieurs minutes, alors que la commande est en cours d'exécution. Vous pouvez résoudre ce problème en ajoutant l'option -v drapeau ( mode verbeux ) qui liste le nom de chaque fichier au fur et à mesure qu'il l'extrait.

0 votes

Si vous avez des problèmes avec cela, notez le --strip-components=1 les conseils de l'autre réponse également.

320voto

Bryan Larsen Points 3371

Notez que si votre archive contient déjà un nom de répertoire que vous souhaitez modifier, ajoutez l'option --strip-components=1 option :

tar xf archive.tar -C /target/directory --strip-components=1

2 votes

Merci. Les téléchargements via wget/etc ont toujours un répertoire "parent". C'est la réponse complète à mon avis - ou cela devrait être noté dans la réponse ci-dessus.

1 votes

Juste ce que je cherchais. --strip-components est très utile lorsque vous exécutez des provisionneurs qui peuvent utiliser des versions différentes. De cette façon /target/directory peut être un nom générique, sans avoir à se soucier de la façon dont le fournisseur a choisi de nommer son dossier d'archives.

0 votes

Il faut savoir que cela peut supprimer un certain nombre d'annuaires principaux, pas seulement un : --strip-components=NUMBER supprimer les composants principaux NUMBER des noms de fichiers lors de l'extraction.

37voto

Thamme Gowda Points 481

En combinant les réponses et les commentaires précédents :

Pour simplement extraire le contenu et créer le répertoire cible s'il est manquant :

mkdir -p /target/directory && tar xf archive.tar -C /target/directory

Pour extraire et aussi supprimer le répertoire racine (premier niveau) dans le zip

mkdir -p /target/directory && tar xf archive.tar -C /target/directory --strip-components=1

0 votes

Vous pouvez ignorer la création du répertoire en ajoutant l'option --one-top-level=/target/directory à la commande tar, et en supprimant l'option -C option. Voir ce qui suit réponse

34voto

Dean Householder Points 441

Une autre option consiste à utiliser --one-top-level. Cela créera automatiquement un répertoire basé sur le nom de fichier de l'original.

tar zxvf filename.tgz --one-top-level

De plus, si vous le souhaitez, vous pouvez spécifier votre propre modèle et tar le créera automatiquement.

tar zxvf filename.tgz --one-top-level=new_directory

5 votes

J'utilise GNU tar 1.26 et j'obtiens une erreur d'option non reconnue pour --one-top-level

1 votes

C'est la réponse dont j'avais besoin. Très utile pour "ne pas" avoir à spécifier le nom du répertoire, ou se souvenir d'un code spécial qui renverra au fichier pour le nom. Merci.

2voto

André Cruz Points 146

Ce que j'ai trouvé intéressant par rapport à l'extraction, c'est que cela dépend de la façon dont vous avez créé l'archive, voir cet exemple

cd /tmp
mkdir folder
touch folder/file.txt

quand vous le faites tar -zcvf folder.tar.gz folder tout est comme prévu = quand vous le déstarrez maintenant, il sera déstarré (le dossier sera créé, si vous l'avez supprimé) en tant que /tmp/folder/ .

Mais, quand vous créerez le goudron comme tar -zcvf tmp-folder.tar.gz /tmp/folder et que vous le désarchivez dans le dossier /tmp, le résultat sera le suivant /tmp/tmp/folder répertoire ! Dans ce cas, vous devez le déstarer vers / -. tar -xf tmp-folder.tar.gz -C /

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X