Tudo bem, levei algum tempo para entender o que o tar -F
realmente faz (isso é documentado em qualquer lugar? Acabei de ler a fonte), mas acho que encontrei uma solução muito boa para você.
Como pv
não suporta fingir que um certo progresso já foi feito, eu precisei substituí-lo por uma ferramenta similar chamada bar
(disponível no Debian com esse nome, ou ver sua horrível homepage ).
A solução que encontrei passa os dados de todos os volumes adicionais por meio de um pipe nomeado (FIFO) para injetar a invocação bar
no fluxo. Para evitar imprimir a barra de progresso de cada volume em uma nova linha, eu uso 'tput' para mover o cursor de volta após cada volume.
No seu código, você substituiria a última linha em changedisk()
pelo seguinte.
(Isso é um pouco hacky por questão de brevidade; basta personalizá-lo uma vez que você tenha a idéia)
tput cuu1 >&2 # clear previous progress bar
(cat somefifo | bar -ns \
--size "$SIZE" \
--completed $(((${TAR_VOLUME}-1)*${VOLSIZE})) \
> ${name:-$TAR_ARCHIVE}-Vol$TAR_VOLUME.tar) &
echo somefifo >&$TAR_FD
E substitua a invocação pv
na última linha do seu script por bar -ns --size ${SIZE}
.
Para que isso funcione, você precisa colocar export
na frente da definição SIZE e, é claro, ter executado mkfifo somefifo
em algum momento antes. Certifique-se de também proteger os bits de permissão do FIFO. Você também pode considerar usar mktemp
para criar um canal temporário com segurança. Depende do seu cenário, eu acho.
Eu usei uma variável ainda não definida $VOLSIZE
que deve se expandir para o tamanho de seus volumes em bytes. Não tenho certeza de como isso é determinado em sua configuração. Talvez você precise fazer algo mais elaborado aqui, como acompanhar a soma cumulativa de todos os tamanhos de volume anteriores.