extraer un solo archivo del enorme archivo tgz

19

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/fileparece 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.txtwhere 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?

Brian
fuente
Me pregunto lo mismo. El archivo que estoy buscando se encuentra rápidamente y se extrae, y luego necesito esperar una hora para que se procese el resto del logro: o (
maasha

Respuestas:

14

Desafortunadamente, para descomprimir un solo miembro del .tar.gzarchivo, 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 el zipformato tiene un directorio central de todos los archivos contenidos con desplazamientos directos que apuntan a la mitad del ziparchivo, por lo que los miembros del archivo se pueden extraer rápidamente sin procesar todo.

¿Podría preguntar por qué el procesamiento .tar.gzes tan lento?

.tar.gz(a menudo acortado como .tgz) es simplemente .tararchivo comprimido con gzipcompresor. gzipes un compresor de transmisión que solo puede funcionar con un archivo. Si desea obtener cualquier parte de la gziptransmisión, debe descomprimirla como un todo, y esto es lo que realmente lo mata .tar.gz(y para .tar.bz2, .tar.xzy otros formatos similares basados ​​en .tar).

.tarEl 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 .tararchivo.

Algunas personas piensan que incluso a los .tarmiembros del archivo no se puede acceder rápidamente, pero esto no es del todo cierto. Si el .tararchivo 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 .tararchivo 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.

mvp
fuente
3
gzip puede transmitir datos sin comprimir, no tiene que deshacer todo. Pero, dado que .tar es la abreviatura de archivo de cinta, debe recorrer todo el archivo hasta que encuentre el archivo que está buscando. Aunque tar seguirá buscando porque puede haber otro, luego copie más tarde en el archivo tar.
kurtm
9

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

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

no se enrollará en todo el tarball después de que encuentre una copia de cada uno passwdy shadow, 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 tarcopias 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=NUMBERpara 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 a NUMBERde 1.

phogg
fuente
¿Hay alguna manera de crear el tar para que un archivo específico sea el primero en salir? entonces eso --occurrenceentrarí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.
Jeff
1
@ Jeff: En realidad no. Esto simplemente evita que tarcontinúe buscando en el tarball las nuevas versiones de un archivo que ha encontrado. En vez vuelve, como la página de hombre dice the Nth occurrence. Si especifica un archivo para extraer en la línea de comando y dice que --occurrencetar saldrá tan pronto como haya encontrado ese archivo, y así se detendrá efectivamente en el "primer archivo".
phogg
1

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.

usuario55325
fuente
1

Cuando se trata de un uso de tarball grande:

--fast-readpara extraer solo la primera entrada de archivo que coincida con el operando del nombre de archivo, path/to/fileen este caso, que siempre es único en tarball

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

lo anterior buscará hasta que encuentre una coincidencia y luego saldrá

Ryan
fuente
1
Quería entender por qué esto todavía está en 0 puntos. 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-readhace diferente --occurrence. Pero entonces --occurrenceni siquiera está en la página de Ubuntu, sino que está en man tar. ¿Son --fast-ready --occurrencelo mismo posiblemente?
Jeff
Ninguna de estas opciones está especificada por el estándar y, como siempre con las opciones no estándar, se debe tener cuidado para asegurarse de que la utilidad en su sistema las soporte. La opción --occurrences es compatible con GNU tar. La opción --fast-read es compatible con versiones recientes del tar de FreeBSD, empaquetadas como bsdtar por Ubuntu. Mira aquí para más.
phogg