Cómo extraer archivos específicos de tar.gz

106

¿Cómo podemos extraer archivos específicos de un archivo tar.gz grande? Encontré el proceso de extraer archivos de un tar en esta pregunta pero, cuando probé el comando mencionado allí, recibí el error:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

¿Cómo puedo extraer un archivo tar.gz?

Ankit Vashistha
fuente
Tenga en cuenta que cualquier solución primero debe descomprimir todo el archivo: superuser.com/questions/655739/… Si desea evitar eso, deberá usar otro formato, como zip. Sin embargo, ZIP dará menos compresión, ya que comprime archivos individuales por separado: superuser.com/questions/1013309/... Me pregunto si hay un formato que admita velocidad y capacidad para extraer un solo archivo.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

120

También puedes usar tar -zxvf <tar filename> <file you want to extract>

Debe escribir el nombre del archivo exactamente como lo tar ztf test.tar.gzmuestra. Si dice ./extract11, por ejemplo , o some/bunch/of/dirs/extract11, eso es lo que tiene que dar (y el archivo se mostrará exactamente con ese nombre, los directorios necesarios se crean automáticamente).

  • -x: indica a tar que extraiga los archivos.
  • -f: especifica el nombre del archivo / tarball.
  • -v: Detallado (muestra el progreso al extraer archivos).
  • -z: filtra el archivo a través de gzip, úsalo para descomprimir archivos .gz.
harish.venkat
fuente
$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha
1
luego intente esto. tar tf archive.tar.gz | grep extract11compruebe si extract11 está en el archivo o no
harish.venkat
8
Debe escribir el nombre del archivo exactamente como lo tar ztf test.tar.gzmuestra. Si dice ./extract11, por ejemplo , o some/bunch/of/dirs/extract11, eso es lo que tiene que dar (y el archivo se mostrará exactamente con ese nombre, los directorios necesarios se crean automáticamente).
vonbrand
Me gustaría agregar un punto aquí, la -zopción no funciona en algunas versiones de Unix como HP-UX.
Ankit Vashistha
1
@ pj-brunet: No, fno debe estar al final. Pero debe ser seguido directamente por el nombre del archivo. Este ejemplo con todas las otras opciones después el nombre de alquitrán funciona bien: tar -f mytar.tar.gz -zxv dir/somefile. Extrae "dir / somefile" de "mytar.tar.gz".
mivk
34

Supongamos que tiene un tarball llamado lotsofdata.tar.gzy solo sabe que hay un archivo allí que desea, pero todo lo que puede recordar es que su nombre contiene la palabra contract. Tienes dos opciones:

Use tary greppara enumerar el contenido de su tarball para que pueda encontrar la ruta completa y el nombre de cualquier archivo que coincida con la parte que conoce, y luego use tarpara extraer ese archivo ahora que conoce sus detalles exactos, o puede usar dos los conmutadores poco conocidos simplemente extraen todos los archivos que coinciden con lo poco que sabe del nombre de su archivo; no necesita saber el nombre completo ni ninguna parte de su ruta para esta opción. Los detalles son:

Opción 1

$ tar -tzf lotsofdata.tar.gz | grep contract

Esto enumerará los detalles de todos los archivos cuyos nombres contienen su parte conocida. Luego extrae lo que quiere usando:

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

Es posible que necesite ./frente a su camino para que funcione.

opcion 2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

Depende de usted lo que encuentre más fácil o más útil.

Wendy Cricks
fuente
Drat Un error tipográfico en ese último comando: dupliqué -xzf. Solo debería haber una instancia de esos interruptores.
Wendy Cricks
tar -xzf lotsofdata.tar.gz <full path and filename from your list above>funcionó para mí sin dar ./al comienzo de la ruta completa
user13107
Es posible que tenga que ser paciente con estos, tomó un tiempo ... También tal vez sea obvio, pero va a extraer la estructura completa del directorio en el directorio actual, incluso si esos directorios aún no existen.
PJ Brunet
BSD tar (al menos en macOS) no admite la --wildcardsopción. Pude seguir teniendo un comportamiento similar con -x -O *foo. *foofue el nombre de archivo global en mi caso, ya que sabía que el archivo terminaba con foo.
Eric Hu
6

Intenté extraer unos cientos de archivos de un tarball con miles de archivos el otro día. Los archivos que necesito no pueden ser referenciados por un solo comodín. Así que busqué en Google y encontré esta página.

Sin embargo, ninguno de los trucos anteriores parece bueno para mi tarea. Terminé leyendo al hombre y encontré esta opción --files-from, así que mi solución final es

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

Y funciona como un encanto.

Actualización: el archivo de lista debe tener el mismo formato que vería tar -tvf, de lo contrario no podría extraer ningún archivo.

JJ Tang
fuente
2

Tu ejemplo funciona para mí si omites las llaves

$ tar --extract --file=test.tar.gz extract11

Si su archivo extract11 está en una subcarpeta, debe especificar la ruta dentro del tarball.

$ tar --extract --file=test.tar.gz subfolder/extract11
Bernhard
fuente
$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha
Entonces, obviamente, extract11 no está en el archivo tar. Asegúrese de que necesita proporcionar la ruta relativa. Ver edición
Bernhard el
1

A continuación encontrará los ejemplos de extracción de archivos específicos del archivo tar.gz.

Del archivo local:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

Desde URL remota:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
kenorb
fuente