20 votes

extraire un seul fichier d'un énorme fichier tgz

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

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

0 votes

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

17voto

user171440 Points 31

Malheureusement, afin de déballer un seul membre de .tar.gz vous devez traiter toute l'archive, et il n'y a pas grand-chose que vous puissiez faire pour le réparer.

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

Vous pourriez demander pourquoi le traitement .tar.gz est si lent ?

.tar.gz (souvent abrégé en .tgz ) est simplement .tar archive compressée avec gzip compresseur. gzip est un compresseur de flux qui ne peut travailler qu'avec un seul fichier. Si vous voulez obtenir une partie de gzip vous devez le décompresser dans son ensemble, et c'est ce qui le tue vraiment pour les raisons suivantes .tar.gz (et pour .tar.bz2 , .tar.xz et d'autres formats similaires basés sur .tar ).

.tar est en fait très, très simple. Il s'agit simplement d'un flux d'en-têtes de fichiers ou de répertoires de 512 octets (nom, taille, etc.), chacun d'eux étant suivi du contenu du fichier ou du répertoire (complété par 0 octet si nécessaire). Lorsque vous observez un bloc de 512 octets totalement nul pour un en-tête, cela signifie la fin du fichier ou du répertoire. .tar archives.

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

3 votes

Gzip peut diffuser des données non comprimées, il n'a pas besoin de tout défaire. Mais, comme .tar est l'abréviation de tape archive, vous devez parcourir l'ensemble du fichier jusqu'à ce que vous trouviez le fichier que vous recherchez. Bien que tar continue à chercher parce qu'il pourrait y avoir une autre copie, plus récente, plus loin dans le fichier tar.

0 votes

Ce n'est pas parce que tar est le diminutif de tape archive, mais étant donné que tar a été conçu à l'origine pour sauvegarder des données sur bande où il n'y a pas d'accès aléatoire, avoir une sorte de répertoire en tête de fichier n'est pas vraiment possible. Comme @phogg le dit dans une autre réponse, vous pouvez spécifier que vous ne voulez qu'une seule occurrence du fichier.

10voto

Michael Easter Points 7482

Si vous extrayez un seul fichier d'un gros fichier tar, vous utilisez GNU tar , et vous pouvez garantir que le fichier tar n'a jamais été annexé à alors vous pouvez obtenir une augmentation 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é.

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

ne parcourra pas l'ensemble de l'archive après avoir trouvé une copie de chacun des éléments suivants passwd y shadow mais il s'arrêtera. Si ces fichiers apparaissent vers la fin, le gain de performance ne sera pas très important, mais s'ils apparaissent ne serait-ce qu'au milieu d'un fichier de 500 Go, vous gagnerez beaucoup de temps.

Pour les personnes utilisant tar Pour les sauvegardes à un seul coup et sans utiliser de véritables lecteurs de bandes, cette situation est probablement le cas typique.

Notez que vous pouvez également passer --occurrence=NUMBER pour récupérer la NUMÉROième occurrence de chaque fichier, ce qui est utile si vous savez qu'il y a sont plusieurs versions dans l'archive. Par défaut, le comportement est égal à un NUMBER de 1.

0 votes

Y a-t-il un moyen de créer le tar de sorte qu'un fichier spécifique soit le premier à sortir ? de sorte que --occurrence se déclencherait 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 ?

1 votes

@Jeff : Pas vraiment. Cela empêche simplement tar de continuer à chercher dans l'archive des versions plus récentes d'un fichier qu'il a trouvé. Au lieu de cela, il retourne, comme le dit la page de manuel, the Nth occurrence . Si vous spécifiez un fichier à extraire sur la ligne de commande et vous dites --occurrence alors tar se terminera dès qu'il aura trouvé ce fichier, et donc efficacement s'arrêter au "premier dossier".

0 votes

En réponse à la question précédente, je précise que tar ajoutera les fichiers dans l'ordre spécifié (sur la ligne de commande, si vous énumérez chaque fichier, ou dans votre liste de fichiers, si vous dites -T). Si vous laissez tar parcourir récursivement un répertoire lui-même les fichiers seront dans l'ordre du répertoire, ce qui n'est pas très prévisible.

3voto

Lorsque vous avez affaire à une grande archive, utilisez :

--fast-read pour extraire uniquement la première entrée de l'archive qui correspond à l'opérande du nom de fichier, path/to/file dans ce cas - qui est toujours unique dans le tarball de toute façon

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

l'opération ci-dessus cherchera jusqu'à ce qu'elle trouve une correspondance, puis quittera.

1 votes

Je voulais comprendre pourquoi il est toujours à 0 point. 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 suis pas sûr de ce que --fast-read fait différemment de --occurrence . Mais alors --occurrence n'est même pas sur la page d'Ubuntu, mais il est en man tar . Sont --fast-read y --occurrence la même chose peut-être ?

0 votes

Aucune de ces options n'est spécifiée par la norme et, comme toujours avec les options non standard, il faut s'assurer que l'utilitaire sur votre système les supporte. L'option --occurrences est prise en charge par GNU tar. L'option --fast-read est supportée par les versions récentes de tar FreeBSD, empaqueté sous le nom de bsdtar par Ubuntu. Voir aquí pour plus.

2voto

Tyler Points 11

Malheureusement, le format de fichier tar ne contient pas de table des matières centralisée - l'archive doit donc être lue de manière séquentielle pour localiser un fichier particulier. Il a été conçu à l'origine pour les sauvegardes sur bande ("tar" vient de t singe ar chive), qui n'aurait de toute façon pas supporté une telle opération.

Donc, vous allez probablement devoir attendre.

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