Parando o tar depois de localizar a entrada ou EOF em um arquivo de fita real

1

Acabei de receber uma pilha de LTO-5s e uma biblioteca de fitas e a empolgante tarefa de extrair um subconjunto de arquivos.

A ordem de magnitude é 60 fitas da pilha, cerca de 10.000 arquivos de 70.000 por fita (em talvez meia dúzia ou uma dúzia de diretórios) que eu preciso puxar. A biblioteca de fitas está executando o tar 1.23

Eu tenho dumps preexistentes do conteúdo de cada fita como por tar --list , por isso estou feliz em conciliar isso com minha lista de arquivos que eu preciso puxar para que eu possa alimentar em um fluxo adequado de registros para agarrar, mas

tar -xvf /dev/nst0 -b $file_to_pull

não pára até eu chegar ao final da fita. O que faz sentido - o tar pode ser alimentado com um padrão de caractere curinga, de modo que vá para o final do arquivo.

Eu acho que eu poderia resolver isso apenas alimentando o diretório glob e removendo arquivos indesejados assim que eles saem da fita, mas não posso deixar de pensar que tem que haver uma maneira de parar o tar no limite de EOF e pular o passo de purga. Certo? Em toda a minha caça no entanto, eu não encontrei nada dessa natureza embora ...

Então, perguntas:

  • Existe uma maneira de obter tar (ou mais alguma coisa) para extrair apenas um arquivo de onde a cabeça da fita estiver, e depois parar ? Ou para sinalizar o tar uma vez que ele recebeu um EOF e parou?

  • Alternadamente, estou atacando mentalmente isso de uma maneira estranha? Feliz por aceitar sugestões de alt, se alguém as tiver.

Lembrando, claro, que esse não é um problema insolúvel no momento, apenas minhas opções atuais parecem ser muito estranhas - esta é a primeira vez que eu realmente tive que lidar com fita nessa magnitude (e nossas outras fitas são todos LTFS)

    
por tanantish 19.06.2015 / 05:13

1 resposta

2

Você pode pedir ao tar para executar uma ação a cada poucos blocos no que eles chamam de pontos de verificação . Esta ação pode testar se o arquivo procurado foi extraído e, se assim for, matar o tar. Eu tentei usando um arquivo tar e parece funcionar ok.

Aqui está meu script de exemplo para fazer meu teste, tarring / usr / bin e extrair usr / bin / bash para / tmp / usr / bin / bash. O padrão - checkpoint é de 10 blocos.

#!/bin/bash

cat <<\! >/tmp/checkdone
#!/bin/bash
# env has TAR_CHECKPOINT TAR_ARCHIVE TAR_VERSION TAR_BLOCKING_FACTOR
# tar -C directory is NOT used for checkpoint action!
want=$1

if size=$(stat --printf='%s\n' "$want" 2>&1)
then if [ "$(</tmp/lastsize)" = "$size" -a -s /tmp/pid ]
    then  echo "same size $size. time to stop"
          ls -l "$want"
          >/tmp/lastsize
          kill -1 $(</tmp/pid)
    else  echo "partial size $size"
          echo "$size" >/tmp/lastsize
    fi
else echo -n "."
fi
!
chmod +x /tmp/checkdone
>/tmp/lastsize
>/tmp/pid

tar -cf /tmp/tar /usr/bin/ # create example tar file
# wanted file. must be in current dir
want=usr/bin/bash
cd /tmp || exit # dont use tar -C dir

tar -xvf /tmp/tar "$want" --checkpoint=10 --checkpoint-action=exec="/tmp/checkdone $want" &
echo $! >/tmp/pid
wait

rm /tmp/tar /tmp/pid /tmp/lastsize /tmp/checkdone
rm -fr /tmp/usr
    
por 19.06.2015 / 12:03