Comment extraire des fichiers dans un autre répertoire en utilisant la commande 'tar'?

672

Je pensais que ça tar archive.tar /users/mylocationmarcherait, mais ça ne marche pas. Comment puis je faire ça?

goovim
la source
1
Aussi, -C, --directory DIR\n change to directory DIRdevrait plutôt être décrit comme change output directory to DIR (will fail if DIR doesn't exist). Merci @Mich. Voir aussi la réponse de @ Bryan_Larsen.
Valable le
1
@Ujjwal Sing: En effet, la page de manuel de tar n'est pas très utile. Il décrit "-C-DIR" comme "changer de répertoire DIR". Pire encore: "tar -C mydir xf archive.tar" ne fonctionne pas, alors que "tar xf archive.tar -C mydir" fonctionne.
Pat Morin
@ PatMorin Pour être juste, une fois que vous avez compris les conventions d'appel d'arguments que vous utilisez, cela a du sens. Vous pouvez aussi faire tar xfC archive.tar mydirou tar -C mydir -xf archive.tar. Ce n’est que le mélange de drapeaux de style traditionnel et de style GNU qui casse les choses, comme… est honnêtement prévu. Les drapeaux traditionnels sont tous passés comme un seul blob comme premier argument. Vous ne pouvez pas vous attendre à ce qu'ils travaillent s'ils ne sont pas les premiers. (Je veux dire, oui, il est possible de l'interpréter de toute façon - mon point est que ce serait au-dessus et au-delà, pas standard)
Nic Hartley

Réponses:

958

Pour extraire une archive dans un répertoire différent de celui en cours, utilisez les options, -Cou --directory, 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éé avec mkdir /target/directory).

Lisez la page de manuel (commande:) man tarpour d'autres options.

Wesley Rice
la source
Le chemin peut-il être supprimé: il suffit de récupérer le fichier
zzapper
3
S'il s'agit d'un fichier plus volumineux, lorsque vous exécutez la commande, vous n'obtenez aucun résultat pendant plusieurs secondes, voire quelques minutes, pendant qu'il fonctionne. Vous pouvez résoudre ce problème en ajoutant le -vdrapeau ( mode détaillé ) qui répertorie le nom de chaque fichier au fur et à mesure de son extraction.
IQAndreas
Si vous rencontrez des problèmes avec cela, notez également le --strip-components=1conseil de l'autre réponse.
DreadPirateShawn
9
@consultstan xkcd.com/1168
Duncan X Simpson
9
N'est-il pas étonnant qu'après toutes ces années, avec toutes les options qui se tarsont accumulées, il n'y ait toujours pas d'option pour créer le répertoire de sortie s'il n'existe pas ?
EM0
261

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

tar xf archive.tar -C /target/directory --strip-components=1
Bryan Larsen
la source
2
Je vous remercie. Les téléchargements via wget / etc ont toujours un répertoire "parent". Ceci est la réponse complète imo - ou devrait être noté dans la réponse ci-dessus.
bshea
Exactement ce que je cherchais. --strip-componentsest si utile lors de l'exécution de fournisseurs qui peuvent utiliser différentes versions. De cette façon, il /target/directorypeut s’agir d’un nom générique, sans avoir à s’inquiéter de la façon dont le fournisseur a choisi de nommer son dossier d’archive.
Jack_Hu
30

Combinaison des réponses précédentes et des commentaires:

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

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

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

mkdir -p /target/directory && tar xf archive.tar -C /target/directory --strip-components=1
Thamme Gowda
la source
20

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 le vôtre et tar le créera automatiquement.

tar zxvf filename.tgz --one-top-level=new_directory
Dean Householder
la source
3
J'utilise GNU tar 1.26 et j'obtiens une erreur d'option non reconnue pour--one-top-level
Emma Strubell
C'est la réponse dont j'avais besoin. Très utile "pas" pour avoir à spécifier le nom du répertoire, ou à retenir un code spécial qui fera référence au fichier pour le nom. Je vous remercie.
Hypocrite
2

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 faites tar -zcvf folder.tar.gz foldertout est comme prévu = lorsque vous le décompressez maintenant, il sera décompressé (le dossier sera créé, si vous l'avez supprimé) comme /tmp/folder/.

Mais, lorsque vous créerez tar en le tar -zcvf tmp-folder.tar.gz /tmp/folderdésarchivant dans le dossier / tmp, le résultat sera /tmp/tmp/folderrépertoire! Dans ce cas, vous devez le décompresser pour / -tar -xf tmp-folder.tar.gz -C /

Betlista
la source
1

Avec tar 1.29, nous pouvons simplement ajouter le nom du répertoire après le nom du fichier tar. Par exemple,

tar zxvf tar-file directory-name/
Shunmuga priyan Selvaraju
la source