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.

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.


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.


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


2
Isso tem que ser dolorosamente lento para chamar o comando tar em um loop. Ele lê o arquivo inteiro toda vez, certo?
— swdev
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.