Descompacte apenas um certo número de arquivos de um grande tarball

12

Eu tenho um grande tarball que está ocupado sendo transferido por FTP de um sistema remoto para o nosso sistema local.

Quero saber se é possível iniciar o desempacotamento, digamos 50 arquivos por vez, para que esses arquivos possam começar a ser processados ​​enquanto a transferência ocorre.

Pieter van Niekerk
fonte

Respostas:

11

Aqui está uma explicação detalhada sobre como é possível extrair arquivos específicos de um arquivo. Especificamente, o tar GNU pode ser usado para extrair um ou mais arquivos de um tarball. Para extrair membros específicos do archive, forneça seus nomes exatos de membros como argumentos.

Por exemplo:

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

Você também pode extrair os arquivos que correspondem a um padrão de globbing específico (curingas). Por exemplo, para extrair do cbz.tar todos os arquivos que começam com pic, independentemente do prefixo do diretório, você pode digitar:

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

Para extrair todos os arquivos php, digite:

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

Onde,

-x: instrui o tar a extrair arquivos.
-f: especifica o nome do arquivo / tarball.
-v: Detalhado (mostra o progresso ao extrair arquivos).
-j: filtre o arquivo morto pelo bzip2, use para descompactar arquivos .bz2.
-z: filtre o arquivo morto pelo gzip, use para descompactar arquivos .gz.
--wildcards: instrui o tar a tratar argumentos da linha de comando como padrões de globbing.
--no-anchored: informa que os padrões se aplicam aos nomes dos membros após qualquer / delimitador.

Eugene S
fonte
3
Não quero extrair arquivos específicos. Eu só quero extrair os primeiros 50 arquivos, pois não sei quais são os nomes dos arquivos.
Pieter van Niekerk
4
Você pode obter uma lista dos nomes de arquivos usando "tar -tf", pegar os primeiros 50 usando "head" e depois alimentar essa lista em outro comando tar como a lista de nomes de arquivos a serem extraídos. Assim: "tar -xf file.tar - não-ancorado` tar -tf file.tar | head -50` "
Simon Hibbs
É bem possível (nos meus testes) extrair um 50º arquivo parcialmente transferido. Seria uma boa idéia evitar extrair o último arquivo (atual) da -tlista até que o tarball seja totalmente baixado. A qualquer momento, a lista mostra apenas os nomes de arquivos que foram ou estão sendo transferidos, ou seja. não a lista completa ; até que seja totalmente baixado.
precisa saber é o seguinte
2

Não tentei isso sozinho, mas e quanto a isso:

tar xvf archive.tar | head -n50

O Tar gera uma linha para STDOUT para cada arquivo extraído, e o headcomando mata o canal após 50 linhas. Com o cano morrendo, eu esperaria que o alcatrão também morresse.

jippie
fonte
Desculpe, isso deveria ter sido a head. Deixe-me mudar minha resposta.
perfil completo de jippie
Não verifiquei, mas receio que, devido ao buffer do pipe, tarpossa extrair mais de 50 arquivos antes do SIGPIPEd e, em particular, possa extrair o último arquivo incompleto.
Gilles 'SO- stop be evil'
2
tar -tvf tarfile.tar

fornece a lista completa de arquivos tarfile.tar

tar -xvf tarfile.tar fileToRestore  

Este comando restaura o fileToRestore

Para desarmar vários arquivos, mas não todos, você pode:

  • Você coloca toda a lista de arquivos tarfile.taremtar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • Agora tar.txttem toda a lista de arquivos tarfile.tar e você pode deixar apenas os arquivos que deseja restaurar ou com a cabeça ...

    head -n50 tar.txt > tar2.txt
    

Você pode colocar essas linhas em um arquivo

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

Ou o arquivo 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 ""

E isso é tudo

user84196
fonte
2
Isso tem que ser dolorosamente lento para chamar o comando tar em um loop. Ele lê o arquivo inteiro toda vez, certo?
swdev