2010-08-12 13 views
13

¿Es posible extraer mediante programación un solo archivo de un archivo .tar.gz de tamaño decente sin extraer todo el archivo tar en el disco? Básicamente, necesito ingresar archivos grandes de tar.gz a través de la red y extraer 1 pequeño archivo de texto. Parece algo exagerado extraer y extraer el tarball en el disco, luego sacar el archivo y luego eliminar todo lo demás. También voy a hacer esto de forma recursiva (por ejemplo, dependencias de paquetes, cada archivo de texto apunta a más tar.gz), de modo que cuanto menos tráfico de red y ciclos de CPU me salgan con la suya, mejor.Extraiga 1 archivo de tar.gz con bash

+1

Nah, está relacionado con bash. Y bash está programando (tipo de). –

+1

@Matt Joiner: No está relacionado realmente con bash. Es una pregunta de uso para una utilidad de sistema común que puede invocarse desde cualquier shell, no solo bash. Pero sí, la programación en bash es de hecho programa, a pesar de lo que puede haber escuchado a veces aquí. – Cascabel

+0

Sí, pensé en SU, pero está dentro de un script de bash relativamente complejo, y va a ser ejecutado a través de una máquina, no por un usuario, así que pensé que era un poco más que SU. – tj111

Respuesta

21

Desde la página del manual, para extraer blah.txt de coco.tar.gz:

tar -xzf foo.tar.gz blah.txt 

(y esto va en superusuario, por supuesto, pero bueno, respuestas rápidas son también muy bueno.)

+0

¿Funcionará esto si el archivo está ubicado en un subdirectorio dentro de la estructura tar.gz? – tj111

+0

Con las versiones modernas de GNU tar, no tiene que especificar la opción 'z' en extraer; deduce eso (y de manera similar con la opción 'j' para archivos comprimidos bzip2). Al crear el archivo, necesitas la opción de decirle a tar qué crear, por lo que la simetría no daña en absoluto. –

+1

@ tj111: si el nombre del archivo en el archivo tar es 'xyz/pqr/abc.txt', eso es lo que especifique en la línea de comando. También puede usar metacaracteres de estilo shell: 'xyz/pqr/*' extraerá todos los archivos de todos los subdirectorios bajo 'xyz/pqr'. Solo desconfíe de si el caparazón expande el '*' por usted: utilice comillas para evitar que lo haga. –

4

Me hago eco de la respuesta de Jefromi, con la adición de incluir la ruta al archivo si tiene directorios en el archivo tar (esto puede parecer obvio para algunos, pero inicialmente no me resultó claro cómo especificar la estructura del directorio).

Por ejemplo, si usted hizo el tar en el directorio src /, y blah.txt estaba en release1/shared /, volvería al directorio src/(si lo quiere desmarcar en el mismo lugar)

tar -xzf tar.gz release1/shared/blah.txt 

Si no recuerda la estructura de directorios del archivo tar (soy un poco desorganizado y, a veces olvido donde hice el alquitrán), siempre se puede

tar -tzf tar.gz 

para ver el contenido , cancelar (Ctrl + C) una vez que tenga una idea de la estructura de su directorio.

+0

Gracias por esto. Aunque parece que necesita un '. /' Delante de los directorios por el motivo que sea para escanearlos. p.ej. 'tar -xzf tar.gz./release1/shared/blah.txt' – tj111

Cuestiones relacionadas