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?


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.


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

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

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

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 /


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/
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.