¿Tar -tvf descomprime el archivo o simplemente enumera los nombres?

9

Tengo un tar.gzarchivo de 32 GB. Intenté extraer carpetas específicas de él, así que enumeré el contenido con el siguiente comando para ver la estructura de los archivos:

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

Parece que lleva una eternidad enumerar todos los archivos. Mi pregunta es ¿el indicador -t extrae también los archivos? Sé que no se extrae en el disco, pero la cantidad de tiempo que lleva me hace preguntarme si realmente los procesa en algún tipo de búfer.

Saif
fuente
1
Se le olvidó la -zopción: tar -tvfz. Similar: ¿Qué sucede si usa el comando tar tvf en lugar de tar tvfz?
smci
3
@smci: se detecta automáticamente, por lo que no se olvida realmente.
Ry-

Respuestas:

14

Los archivos tar.gz no tienen un índice. A diferencia de zip u otros formatos de archivo, no es trivial ni económico obtener una lista de los archivos contenidos u otros metadatos. Para mostrarle qué archivos están contenidos en el archivo, tar necesita descomprimir el archivo y extraer los archivos, aunque en el caso de la -topción solo lo hace en la memoria.

Si un patrón común en su caso de uso es enumerar los archivos contenidos en un archivo, puede considerar usar un formato de archivo que pueda agregar un índice de archivo al archivo comprimido, por ejemplo, zip.

Quizás también desee echar un vistazo al formato HDF5 para escenarios más complejos.

Mediciones

Simplemente tuve que hacer algunas mediciones para probar mi respuesta y creé algunos directorios con muchos archivos y los empaqué, tar czf files#.tgz files#y ambos zip -r files#.zip files#.

Para las pruebas, ejecuté el comando de desempaque dos veces cada vez y tomé el resultado de la segunda ejecución, para tratar de evitar medir la velocidad del disco.

Prueba 1

Directorio que files1contiene 100,000 archivos vacíos .

$ 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 es más lento aquí.

Prueba 2

Directorio que files2contiene 5,000 archivos con 512 bytes de datos aleatorios cada uno.

$ 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

Todavía no es convincente, pero esta vez es más rápido.

Prueba 3

Directorio que files3contiene 5,000 archivos con 5kB de datos aleatorios cada uno.

$ 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

En esta prueba se puede ver que cuanto más grandes son los archivos, más difícil es para tar enumerarlos.

Conclusión

Para mí, parece que zip introduce una pequeña sobrecarga que notarás solo con muchos archivos muy pequeños (casi vacíos), mientras que para un gran número de archivos más grandes gana el concurso al enumerar los archivos contenidos en el archivo.

Sebastian Stark
fuente