extraire un seul fichier d'un énorme fichier tgz


19

J'ai un énorme fichier tar (environ 500G) et je ne veux pas en extraire un seul fichier.
Cependant, lorsque je lance, tar -xvf file.tgz path/to/fileil semble qu'il charge toujours tout le contenu en mémoire et qu'il faut plus d'une heure pour extraire. J'ai également essayé d'utiliser --exclude=ignore.txtoù ignore.txt est une liste de modèles pour l'empêcher de traverser des chemins futiles, mais cela ne semble pas fonctionner.

Peut-être que je ne comprends pas tar ... Y a-t-il un moyen d'extraire rapidement le fichier?


Je me pose la même question. Le fichier que je recherche est trouvé rapidement et extrait - puis je dois attendre une heure pour que le reste de la réalisation soit traité: o (
maasha

Réponses:


14

Malheureusement, pour déballer un seul membre de l' .tar.gzarchive, vous devez traiter l'archive entière, et vous ne pouvez pas faire grand-chose pour la réparer.

C'est là que .zip(et certains autres formats comme .rar) les archives fonctionnent beaucoup mieux, car le zipformat a un répertoire central de tous les fichiers qu'il contient avec des décalages directs pointant vers le milieu du zipfichier, de sorte que les membres de l'archive peuvent être rapidement extraits sans traiter le tout.

Vous pourriez vous demander pourquoi le traitement .tar.gzest si lent?

.tar.gz(souvent abrégé en .tgz) est simplement .tararchivé compressé avec gzipcompresseur. gzipest un compresseur de streaming qui ne peut fonctionner qu'avec un seul fichier. Si vous voulez obtenir une partie du gzipflux, vous devez le décompresser dans son ensemble, et c'est ce qui le tue vraiment .tar.gz(et pour .tar.bz2, .tar.xzet d'autres formats similaires basés sur .tar).

.tarle format est en fait très, très simple. Il s'agit simplement d'un flux d'en-têtes de fichier ou de répertoire de 512 octets (nom, taille, etc.), chacun suivi du contenu du fichier ou du répertoire (complété à une taille de bloc de 512 avec 0 octet si nécessaire). Lorsque vous observez un bloc 512 totalement nul pour un en-tête, cela signifie la fin de l' .tararchive.

Certaines personnes pensent que même .tarles membres des archives ne sont pas accessibles rapidement, mais ce n'est pas tout à fait vrai. Si l' .tararchive contient peu de gros fichiers, vous pouvez en fait rechercher rapidement dans l'en-tête suivant, et ainsi vous pouvez trouver le membre d'archive nécessaire en quelques recherches (mais il pourrait toujours nécessiter autant de recherches qu'il y a de membres d'archive). Si votre .tararchive contient de nombreux fichiers minuscules, cela signifie que la récupération rapide des membres devient effectivement impossible même pour les fichiers non compressés .tar.


3
gzip peut diffuser des données non compressées, il n'a pas besoin d'annuler le tout. Mais, comme .tar est l'abréviation de archive sur bande, vous devez parcourir l'intégralité du fichier jusqu'à ce que vous trouviez le fichier que vous recherchez. Bien que tar continue de chercher car il peut y en avoir un autre, copiez-le plus tard dans le fichier tar.
kurtm

9

Si vous extrayez un seul fichier d'un grand fichier tar, vous utilisez GNU tar, et vous pouvez garantir que le fichier tar n'a jamais été ajouté, alors vous pouvez obtenir une amélioration significative des performances en utilisant --occurrence.

Cette option indique à tar de s'arrêter dès qu'il trouve la première occurrence de chaque fichier que vous avez demandé, par exemple

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

ne se déroulera pas dans toute l'archive tar une fois qu'il aura trouvé une copie de chacun passwdet shadow, à la place, il s'arrêtera. Si ces fichiers apparaissent vers la fin, le gain de performances ne sera pas beaucoup, mais s'ils apparaissent même à mi-chemin dans un fichier 500G, vous gagnerez beaucoup de temps.

Pour les personnes utilisant tardes sauvegardes à une seule prise et n'utilisant pas de vrais lecteurs de bande, cette situation est probablement le cas typique.

Notez que vous pouvez également passer --occurrence=NUMBERpour récupérer l'occurrence NUMBERth de chaque fichier, ce qui est utile si vous savez qu'il existe plusieurs versions dans l'archive. Par défaut, le comportement est égal à a NUMBERde 1.


Existe-t-il un moyen de créer le tar afin qu'un fichier spécifique soit le premier à sortir? de sorte que --occurrencecela se déclenche immédiatement sur le premier fichier? Je suppose qu'il s'agit de noms de fichiers, donc quelque chose appelé aaaaa.jpg sortirait en premier par exemple?
Jeff

1
@Jeff: Pas vraiment. Cela empêche simplement tarde continuer à rechercher dans l'archive tar les nouvelles versions d'un fichier qu'il a trouvé. Au contraire , il revient, comme le dit la page de manuel, the Nth occurrence. Si vous spécifiez un fichier à extraire sur la ligne de commande et que vous dites, --occurrencetar se fermera dès qu'il aura trouvé ce fichier et s'arrêtera donc effectivement au "premier fichier".
phogg

1

Malheureusement, le format de fichier tar ne contient pas de table des matières centralisée - donc l'archive doit être lue séquentiellement pour localiser un fichier particulier. Il a été initialement conçu pour les sauvegardes sur bande ("tar" vient de t ape ar chive), qui n'aurait en aucun cas supporté une telle opération.

Donc, vous devrez probablement attendre.


1

En cas d'utilisation d'une grande archive tar:

--fast-readpour extraire uniquement la première entrée d'archive qui correspond à l'opérande de nom de fichier, path/to/filedans ce cas - qui est toujours unique dans l'archive tar de toute façon

tar -xvf file.tgz --fast-read path/to/file

ce qui précède cherchera jusqu'à ce qu'il trouve une correspondance, puis quittera


1
Je voulais comprendre pourquoi c'est toujours à 0 points. man tar(GNU tar 1.29) n'imprime même pas cette option. Cependant, Ubuntu semble l'avoir activé par défaut . En lisant rapidement, je ne sais pas ce qui --fast-readfait différemment --occurrence. Mais ce --occurrencen'est même pas sur la page Ubuntu, mais c'est dans man tar. Sont --fast-readet --occurrencela même chose peut - être?
Jeff

Aucune de ces options n'est spécifiée par la norme et, comme toujours avec les options non standard, vous devez vous assurer que l'utilitaire de votre système les prend en charge. L'option --occurrences est prise en charge par GNU tar. L'option --fast-read est prise en charge par les versions récentes du tar FreeBSD, empaqueté comme bsdtar par Ubuntu. Voir ici pour en savoir plus.
phogg
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.