Eu tenho um tarball grande que está ocupado sendo transferido por FTP de um sistema remoto para o nosso sistema local.
Quero saber se é possível começar a descompactar, digamos, 50 arquivos por vez, para que esses arquivos possam começar a ser processados enquanto a transferência ocorre.
Responder1
Aquié uma explicação detalhada sobre como é possível extrair arquivos específicos de um arquivo. Especificamente, o GNU tar pode ser usado para extrair um único ou mais arquivos de um tarball. Para extrair membros específicos do arquivo, forneça os nomes exatos dos membros como argumentos.
Por exemplo:
tar --extract --file={tarball.tar} {file}
Você também pode extrair os arquivos que correspondem a um padrão globbing específico (curingas). Por exemplo, para extrair de 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/nome do tarball.
-v
: Verbose (mostra o progresso durante a extração de arquivos).
-j
: filtre o arquivo através do bzip2, use para descompactar arquivos .bz2.
-z
: filtre o arquivo através do gzip, use para descompactar arquivos .gz.
--wildcards
: instrui o tar a tratar os argumentos da linha de comando como padrões globais.
--no-anchored
: informa que os padrões se aplicam aos nomes dos membros após qualquer delimitador /.
Responder2
tar -tvf tarfile.tar
fornece a lista completa de arquivos emtarfile.tar
tar -xvf tarfile.tar fileToRestore
Este comando restaura ofileToRestore
Para descompactar vários arquivos, mas não todos, você pode:
Você coloca toda a lista de arquivos
tarfile.tar
emtar.txt
tar -tvf tarfile.tar > tar.txt
Agora
tar.txt
tem toda a lista de arquivostarfile.tar
e você pode deixar apenas os arquivos que deseja restaurar ou com head...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
Responder3
Não tentei isso sozinho, mas que tal isto:
tar xvf archive.tar | head -n50
Tar gera uma linha para STDOUT para cada arquivo extraído, então o head
comando encerrará o pipe após 50 linhas. Após a morte do cano, eu esperaria que o alcatrão também morresse.