Tengo un gran archivo tar (aproximadamente 500G) y no quiero extraer un solo archivo de él.
Sin embargo, cuando ejecuto tar -xvf file.tgz path/to/file
parece que todavía está cargando todo el contenido en la memoria, y toma más de una hora extraerlo. También he intentado usar --exclude=ignore.txt
where ignore.txt es una lista de patrones en un intento de evitar que atraviese caminos inútiles, pero eso no parece funcionar.
Quizás no entiendo el alquitrán ... ¿Hay alguna forma de extraer rápidamente el archivo?
Respuestas:
Desafortunadamente, para descomprimir un solo miembro del
.tar.gz
archivo, debe procesar todo el archivo, y no puede hacer mucho para solucionarlo.Aquí es donde
.zip
(y algunos otros formatos como.rar
) los archivos funcionan mucho mejor, porque elzip
formato tiene un directorio central de todos los archivos contenidos con desplazamientos directos que apuntan a la mitad delzip
archivo, por lo que los miembros del archivo se pueden extraer rápidamente sin procesar todo.¿Podría preguntar por qué el procesamiento
.tar.gz
es tan lento?.tar.gz
(a menudo acortado como.tgz
) es simplemente.tar
archivo comprimido congzip
compresor.gzip
es un compresor de transmisión que solo puede funcionar con un archivo. Si desea obtener cualquier parte de lagzip
transmisión, debe descomprimirla como un todo, y esto es lo que realmente lo mata.tar.gz
(y para.tar.bz2
,.tar.xz
y otros formatos similares basados en.tar
)..tar
El formato es realmente muy, muy simple. Es simplemente una secuencia de archivos de 512 bytes o encabezados de directorio (nombre, tamaño, etc.), cada uno seguido del contenido del archivo o directorio (rellenado con un tamaño de bloque de 512 con 0 bytes si es necesario). Cuando observa un bloque 512 totalmente nulo para un encabezado, esto significa el final del.tar
archivo.Algunas personas piensan que incluso a los
.tar
miembros del archivo no se puede acceder rápidamente, pero esto no es del todo cierto. Si el.tar
archivo contiene pocos archivos grandes, puede buscar rápidamente el siguiente encabezado y, por lo tanto, puede encontrar el miembro de archivo necesario en pocas búsquedas (pero aún podría requerir tantas búsquedas como miembros de archivo). Si su.tar
archivo contiene muchos archivos pequeños, esto significa que la recuperación rápida de miembros se vuelve efectivamente imposible incluso para los no comprimidos.tar
.fuente
Si extrae solo un archivo de un archivo tar grande, está utilizando GNU
tar
, y puede garantizar que nunca se haya agregado el archivo tar, entonces puede obtener un aumento significativo del rendimiento mediante el uso--occurrence
.Esta opción le dice a tar que se detenga tan pronto como encuentre la primera aparición de cada archivo que solicitó, por ejemplo
no se enrollará en todo el tarball después de que encuentre una copia de cada uno
passwd
yshadow
, en su lugar, se detendrá. Si esos archivos aparecen cerca del final, la ganancia de rendimiento no será mucho, pero si aparecen incluso a la mitad de un archivo 500G, ahorrará mucho tiempo.Para las personas que usan
tar
copias de seguridad de disparo único y no usan unidades de cinta reales, esta situación es probablemente el caso típico.Tenga en cuenta que también puede pasar
--occurrence=NUMBER
para recuperar la ocurrencia NUMBERth de cada archivo, lo que ayuda si usted sabe que no son múltiples versiones del archivo. Por defecto, el comportamiento es igual a aNUMBER
de 1.fuente
--occurrence
entraría de inmediato en el primer archivo? Supongo que se trata de nombres de archivos, por lo que algo llamado aaaaa.jpg saldría primero, por ejemplo.tar
continúe buscando en el tarball las nuevas versiones de un archivo que ha encontrado. En vez vuelve, como la página de hombre dicethe Nth occurrence
. Si especifica un archivo para extraer en la línea de comando y dice que--occurrence
tar saldrá tan pronto como haya encontrado ese archivo, y así se detendrá efectivamente en el "primer archivo".Desafortunadamente, el formato del archivo tar no contiene una tabla de contenido centralizada, por lo que el archivo debe leerse secuencialmente para ubicar un archivo en particular. Originalmente se diseñó para copias de seguridad en cinta ("tar" proviene de t ape ar chive), lo que no habría admitido dicha operación en ningún caso.
Entonces, probablemente solo tengas que esperar.
fuente
Cuando se trata de un uso de tarball grande:
lo anterior buscará hasta que encuentre una coincidencia y luego saldrá
fuente
man tar
(GNU tar 1.29) ni siquiera imprime esta opción. Sin embargo, Ubuntu parece tenerlo habilitado por defecto . Leyendo rápidamente, no estoy seguro de qué--fast-read
hace diferente--occurrence
. Pero entonces--occurrence
ni siquiera está en la página de Ubuntu, sino que está enman tar
. ¿Son--fast-read
y--occurrence
lo mismo posiblemente?