Comment extraire des fichiers spécifiques de tar.gz

106

Comment pouvons-nous extraire des fichiers spécifiques d'un gros fichier tar.gz? J'ai trouvé le processus d'extraction de fichiers d'un fichier .tar dans cette question, mais lorsque j'ai essayé la commande mentionnée ici, j'ai eu l'erreur:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

Comment puis-je extraire un fichier tar.gz?

Ankit Vashistha
la source
Notez que toute solution doit d'abord décompresser l'archive complète: superuser.com/questions/655739/… Si vous voulez éviter cela, vous devrez utiliser un autre format, tel que zip. ZIP donnera toutefois moins de compression, car il compresse un fichier individuel séparément: superuser.com/questions/1013309/… Je me demande s’il existe un format qui prend en charge à la fois la vitesse et la capacité d’extraire un seul fichier.
Ciro Santilli

Réponses:

120

Vous pouvez aussi utiliser tar -zxvf <tar filename> <file you want to extract>

Vous devez écrire le nom du fichier exactement comme indiqué tar ztf test.tar.gz. S'il est indiqué par exemple ./extract11, ou some/bunch/of/dirs/extract11si c'est ce que vous devez donner (et le fichier apparaîtra exactement sous ce nom, les répertoires nécessaires sont créés automatiquement).

  • -x: indique à tar d'extraire les fichiers.
  • -f: spécifie le nom du fichier / nom du fichier.
  • -v: Verbose (montrer la progression lors de l'extraction des fichiers).
  • -z: filtre les archives via gzip, permet de décompresser les fichiers .gz.
harish.venkat
la source
$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha le
1
puis essayez ceci tar tf archive.tar.gz | grep extract11.s'il vous plaît vérifier si extrait11 est dans les archives ou pas
harish.venkat
8
Vous devez écrire le nom du fichier exactement comme indiqué tar ztf test.tar.gz. S'il est indiqué par exemple ./extract11, ou some/bunch/of/dirs/extract11si c'est ce que vous devez donner (et le fichier apparaîtra exactement sous ce nom, les répertoires nécessaires sont créés automatiquement).
vonbrand
Je voudrais ajouter un point ici, l' -zoption ne fonctionne pas dans certaines versions d'Unix comme HP-UX.
Ankit Vashistha
1
@ pj-brunet: Non, fil ne faut pas être à la fin. Mais il doit être directement suivi du nom du fichier. Cet exemple avec toutes les autres options après le nom de goudron fonctionne très bien: tar -f mytar.tar.gz -zxv dir/somefile. Il extrait "dir / somefile" de "mytar.tar.gz".
mardi
34

Supposons que vous avez une archive appelée lotsofdata.tar.gzet que vous savez simplement qu'il y a un fichier que vous voulez, mais tout ce dont vous vous souvenez, c'est que son nom contient le mot contract. Vous avez deux options:

Utilisez soit taret greppour lister le contenu de votre archive afin de trouver le chemin complet et le nom de tout fichier correspondant à la partie que vous connaissez, puis utilisez-le tarpour extraire ce fichier maintenant vous en connaissez les détails exacts, ou vous pouvez utiliser deux les commutateurs peu connus ne permettent d'extraire que tous les fichiers qui correspondent au peu que vous savez de votre nom de fichier - vous n'avez pas besoin de connaître le nom complet ni aucune partie de son chemin pour cette option. Les détails sont:

Option 1

$ tar -tzf lotsofdata.tar.gz | grep contract

Ceci listera les détails de tous les fichiers dont le nom contient votre partie connue. Ensuite, vous extrayez ce que vous voulez en utilisant:

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

Vous devrez peut-être ./devant votre chemin pour que cela fonctionne.

Option 2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

A vous de choisir ce que vous trouvez le plus facile ou le plus utile.

Wendy Cricks
la source
Drat. Une faute de frappe sur cette dernière commande: j'ai dupliqué -xzf. Il ne devrait y avoir qu'une seule instance de ces commutateurs.
Wendy Cricks
tar -xzf lotsofdata.tar.gz <full path and filename from your list above>travaillé pour moi avec votre donner ./au début du chemin complet
utilisateur13107
Vous devrez peut-être être patient avec cela, cela a pris un certain temps ... Peut-être que c'est évident, mais cela va extraire la structure de répertoires complète dans le répertoire actuel, même si ces répertoires n'existent pas encore.
PJ Brunet
BSD tar (au moins sur macOS) ne prend pas en charge cette --wildcardsoption. Je pouvais toujours avoir un comportement similaire avec -x -O *foo. *fooétait le nom de fichier glob dans mon cas, puisque je savais que le fichier se terminait par foo.
Eric Hu
6

J'essayais d'extraire quelques centaines de fichiers d'une archive contenant des milliers de fichiers l'autre jour. Les fichiers dont j'ai besoin ne peuvent pas être référencés par un seul caractère générique. Alors j'ai googlé et trouvé cette page.

Cependant, aucune des astuces ci-dessus ne semble bonne pour ma tâche. J'ai fini par lire l'homme et j'ai trouvé cette option --files-from; ma dernière solution est donc

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

et cela fonctionne comme un charme.

Mise à jour: le fichier de liste doit avoir le même format que celui que vous verriez tar -tvf, sinon vous ne pourriez pas extraire de fichier.

JJ Tang
la source
2

Votre exemple fonctionne pour moi si vous omettez les accolades

$ tar --extract --file=test.tar.gz extract11

Si votre fichier extract11 se trouve dans un sous-dossier, vous devez spécifier le chemin dans l'archive.

$ tar --extract --file=test.tar.gz subfolder/extract11
Bernhard
la source
$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha le
Ensuite, extraire avec objection11 ne se trouve pas dans le fichier tar. Assurez-vous que vous devez fournir le chemin relatif. Voir éditer
Bernhard
1

Veuillez trouver ci-dessous des exemples d'extraction de fichiers spécifiques à partir d'un fichier tar.gz.

À partir du fichier local:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

De l'URL distante:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
Kenorb
la source