Descomprima solo una cierta cantidad de archivos de un gran tarball

12

Tengo un gran tarball que está ocupado enviando FTP desde un sistema remoto a nuestro sistema local.

Quiero saber si es posible comenzar a descomprimir, digamos 50 archivos a la vez para que esos archivos puedan comenzar a procesarse mientras se realiza la transferencia.

Pieter van Niekerk
fuente

Respuestas:

12

Aquí hay una explicación detallada sobre cómo es posible extraer archivos específicos de un archivo. Específicamente, GNU tar puede usarse para extraer uno o más archivos de un tarball. Para extraer miembros específicos del archivo, proporcione sus nombres de miembro exactos como argumentos.

Por ejemplo:

tar --extract --file={tarball.tar} {file}

También puede extraer aquellos archivos que coincidan con un patrón de globo específico (comodines). Por ejemplo, para extraer de cbz.tar todos los archivos que comienzan con pic, sin importar su prefijo de directorio, puede escribir:

tar -xf cbz.tar --wildcards --no-anchored 'pic*'

Para extraer todos los archivos php, ingrese:

tar -xf cbz.tar --wildcards --no-anchored '*.php'

Dónde,

-x: indica a tar que extraiga los archivos.
-f: especifica el nombre del archivo / tarball.
-v: Detallado (muestra el progreso al extraer archivos).
-j: filtra el archivo a través de bzip2, úsalo para descomprimir archivos .bz2.
-z: filtra el archivo a través de gzip, úsalo para descomprimir archivos .gz.
--wildcards: indica a tar que trate los argumentos de la línea de comandos como patrones globales.
--no-anchored: le informa que los patrones se aplican a los nombres de miembros después de cualquier / delimitador.

Eugene S
fuente
3
No quiero extraer archivos específicos. Solo quiero extraer los primeros 50 archivos, ya que no sé cuáles son los nombres de los archivos.
Pieter van Niekerk
44
Puede obtener una lista de los nombres de archivo usando "tar -tf", tome los primeros 50 usando "head", luego alimente esa lista en otro comando tar como la lista de nombres de archivo para extraer. De esta manera: "tar -xf file.tar --no-anchred` tar -tf file.tar | head -50` "
Simon Hibbs
Es bastante posible (en mis pruebas) extraer un archivo número 50 parcialmente transferido. Sería una buena idea evitar extraer el último archivo (actual) de la -tlista hasta que el tarball se descargue completamente. En cualquier momento, la lista muestra solo nombres de archivos que han sido, o están siendo transferidos, es decir. no la lista completa ; hasta que esté completamente descargado.
Peter.O
2

No lo intenté yo mismo, pero ¿qué tal esto?

tar xvf archive.tar | head -n50

Tar envía una línea a STDOUT por cada archivo extraído, luego el headcomando matará la tubería después de 50 líneas. Al morir la tubería, esperaría que el alquitrán también muriera.

jippie
fuente
Lo siento, eso debería ser, por supuesto, un head. Déjame cambiar mi respuesta.
jippie
No lo he comprobado, pero me temo que, debido al búfer de tuberías, tarpuede extraer más de 50 archivos antes de que sea SIGPIPEd, y en particular puede extraer el último archivo incompleto.
Gilles 'SO- deja de ser malvado'
2
tar -tvf tarfile.tar

te da la lista completa de archivos en tarfile.tar

tar -xvf tarfile.tar fileToRestore  

Este comando restaura el fileToRestore

Para descomprimir varios archivos, pero no todos, puede:

  • Pones toda la lista de archivos tarfile.tarentar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • Ahora tar.txttiene toda la lista de archivos tarfile.tar y puede dejar solo los archivos que desea restaurar o con la cabeza ...

    head -n50 tar.txt > tar2.txt
    

Puedes poner estas líneas en un archivo

cat tar.txt|while read line
do
   tar -xvf tarfile.tar ${line}
done

O el archivo de script completo:

#!/bin/bash

if [[ "$1" = "" || "$2" = "" ]]
   then
   echo ""
   echo "Uso: untar-list.sh tarfile.tar listfile.txt"
   echo ""
   exit 1
fi

tarfile=$1
file=$2

if [[ ! -f ${tarfile} ]]
   then
   echo ""
   echo "Archivo ${tarfile} no existe"
   echo ""
   exit 1
fi

if [[ ! -f ${file} ]]
   then
   echo ""
   echo "Archivo ${file} no existe"
   echo ""
   exit 1
fi

cat ${file}|while read line
do
  tar -xvf ${tarfile} ${line}
done

echo ""
echo "Finalizado"
echo ""

Y eso es todo

user84196
fuente
2
Eso tiene que ser muy lento para llamar al comando tar en un bucle. Lee el archivo completo cada vez, ¿verdad?
swdev