web-dev-qa-db-fra.com

Est-ce que tar -tvf décompresse le fichier ou juste la liste des noms?

J'ai un fichier tar.gz de 32 Go. J'essayais d'en extraire des dossiers spécifiques. J'ai donc répertorié le contenu à l'aide de la commande suivante pour afficher la structure des fichiers:

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

Il semble prendre un temps fou pour lister tous les fichiers. Ma question est la suivante: le drapeau -t extrait-il également les fichiers? Je sais que cela n’est pas extrait sur le disque, mais le temps que cela prend me fait me demander s’il les traite réellement dans une sorte de tampon.

9
Saif

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

Si l'un des modèles courants dans votre cas d'utilisation consiste à répertorier les fichiers contenus dans une archive, vous pouvez envisager d'utiliser un format d'archive permettant d'ajouter un index de fichier au fichier compressé, e. g. Zip *: français.

Vous voudrez peut-être aussi jeter un coup d'œil au format HDF5 pour des scénarios plus complexes.

Des mesures

Je devais faire quelques mesures pour prouver ma réponse, créer des répertoires contenant de nombreux fichiers et les ranger dans lesquels étaient tous les deux tar czf files#.tgz files# et Zip -r files#.Zip files#.

Pour les tests, j'ai exécuté la commande de décompression 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 files1 contenant 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

La fermeture éclair est plus lente ici.

Test 2

Répertoire files2 contenant 5 000 fichiers de 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 Zip est plus rapide cette fois-ci.

Test 3

Répertoire files3 contenant 5 000 fichiers de 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 constate que plus les fichiers sont volumineux, plus il est difficile pour la liste tar de les répertorier.

Conclusion

Pour moi, il me semble que Zip introduit un peu de surcharge que vous remarquerez uniquement avec de nombreux très petits fichiers (presque vides), alors que pour un grand nombre de fichiers plus volumineux, il remporte le concours en listant les fichiers contenus dans les archives.

14
Sebastian Stark