
Gostaria de adicionar uma barra de progresso ao meu comando tar backup. Eu descobri que obarO shell script deve ser capaz de fazer isso, mas não consigo descobrir o comando correto.
sudo tar pzcf - /media/data | bar > /media/backups/backup.tar.gz
Com o comando acima consegui exibir algumas informações, mas nenhuma barra de progresso ainda.
Responder1
Desculpe, mas isso não é possível. Do próprio arquivo bar
:
Synopsis:
'bar' works just like 'cat', but shows a progress bar in ASCII art on stderr.
The script's main function is meant to be usable in any Bourne shell to be
suitable for install scripts without the need for any additional tool.
O problema é que, para exibir a barra de progresso, bar
é preciso primeiro saber o tamanho do arquivo.
Paraextraindoum arquivo, não há problema: se backup.tar
for 100 MiB
grande e 50 MiB
tiver sido processado até agora, estamos em 50 %
.
No entanto, paracriandoum arquivo, bar
lido em stdin
, que é infinito para todos os efeitos práticos. Enquanto odocumentaçãodiz:
Streams infinitos não são legais: a barra só é exibida em 0% e 100%. [...]
A única maneira de exibir barras de progresso para fins de backup que consigo imaginar (além de compilar uma versão personalizada doalcatrão com barra) é:
Calcule o tamanho acumulado dos arquivos
/media/data
.Crie
backup.tar
e anexe os arquivos/media/data
um por um.Após cada arquivo, calcule a porcentagem atual e exiba-a.
gzip
backup.tar
(vocêpodeusartar
para isso).
Exemplo:
TOTAL=$(du -b /media/data | grep -oP "^\d+")
CURRENT=0
echo "Archiving:"
IFS="
"
for FILE in $(find /media/data -type f); do
tar rf backup.tar $FILE
CURRENT=$(($CURRENT+$(du -b $FILE | grep -oP "^\d+")))
echo -en "\r"$((100*($CURRENT-1)/$TOTAL+1))"%"
done
echo
echo "Compressing:"
bar backup.tar | gzip > backup.tar.gz
rm backup.tar
Cuidado:
- Isso provavelmente retardará o progresso do backup.
- Os nomes dos arquivos não podem conter caracteres de nova linha.