Est-ce que tar -tvf décompresse le fichier ou répertorie simplement les noms?

9

J'ai un tar.gzfichier de 32 Go. J'essayais d'en extraire des dossiers spécifiques, j'ai donc répertorié le contenu avec la commande suivante pour afficher la structure des fichiers:

tar -tvf file.tar.gz > files.txt

Il semble que cela prenne une éternité pour répertorier tous les fichiers. Ma question est le drapeau -t extraire également les fichiers? Je sais qu'il ne s'extrait pas sur le disque mais le temps qu'il faut me fait me demander s'il les traite réellement dans une sorte de tampon.

Saif
la source
1
Vous avez oublié l' -zoption de : tar -tvfz. Similaire: que se passe-t-il si vous utilisez la commande tar tvf par opposition à tar tvfz?
smci
3
@smci: Il est détecté automatiquement, donc pas vraiment oublié.
Ry-

Réponses:

14

Les fichiers tar.gz n'ont pas d'index. Contrairement à zip ou à d'autres formats d'archives, il n'est pas trivial ni bon marché d'obtenir une liste des fichiers contenus ou d'autres métadonnées. Afin de vous montrer quels fichiers sont contenus dans l'archive, tar doit en effet décompresser l'archive et extraire les fichiers, bien que dans le cas de l' -toption, il ne le fasse qu'en mémoire.

Si un modèle courant dans votre cas d'utilisation est de répertorier les fichiers contenus dans une archive, vous pouvez envisager d'utiliser un format d'archive qui peut ajouter un index de fichier au fichier compressé, par exemple zip.

Peut-être souhaitez-vous également jeter un œil au format HDF5 pour des scénarios plus complexes.

Des mesures

Je devais juste faire quelques mesures pour prouver ma réponse et créer des répertoires avec de nombreux fichiers et les emballer qui les deux, tar czf files#.tgz files#et zip -r files#.zip files#.

Pour les tests, j'ai exécuté la commande de déballage deux fois à chaque fois et pris le résultat de la deuxième exécution, pour éviter de mesurer la vitesse du disque.

Test 1

Répertoire files1contenant 100 000 fichiers vides .

$ time tar tzf files1.tgz >/dev/null
tar tzf files1.tgz > /dev/null  0,56s user 0,09s system 184% cpu 0,351 total
$ time unzip -l files1.zip >/dev/null
unzip -l files1.zip > /dev/null  0,30s user 0,34s system 99% cpu 0,649 total

zip est plus lent ici.

Test 2

Répertoire files2contenant 5 000 fichiers avec 512 octets de données aléatoires chacun.

$ time tar tzf files2.tgz >/dev/null
tar tzf files2.tgz > /dev/null  0,14s user 0,03s system 129% cpu 0,131 total
$ time unzip -l files2.zip >/dev/null
unzip -l files2.zip > /dev/null  0,03s user 0,06s system 98% cpu 0,092 total

Toujours pas convaincant, mais le zip est plus rapide cette fois.

Test 3

Répertoire files3contenant 5 000 fichiers avec 5 Ko de données aléatoires chacun.

$ time tar tzf files3.tgz >/dev/null
tar tzf files3.tgz > /dev/null  0,42s user 0,03s system 111% cpu 0,402 total
$ time unzip -l files3.zip >/dev/null
unzip -l files3.zip > /dev/null  0,03s user 0,06s system 99% cpu 0,093 total

Dans ce test, on peut voir que plus les fichiers sont volumineux, plus il est difficile pour tar de les lister.

Conclusion

Pour moi, il semble que zip présente un petit surcoût que vous ne remarquerez qu'avec de nombreux très petits fichiers (presque vides), tandis que pour un grand nombre de fichiers plus gros, il remporte le concours lors de la liste des fichiers contenus dans l'archive.

Sebastian Stark
la source