Exibe a transferência do wget de uma maneira mais compacta (mantendo a funcionalidade de detecção de erros)

2

Eu sei que o wget tem algumas opções para exibir ou não as barras de progresso.

Eu gostaria de exibir a transferência do wget de uma forma mais curta, ou ... um percentual ou algo dinâmico, mas não ocupando tanto espaço como a saída clássica do wget, porque eu tenho que inseri-lo em um script com a sua saída.

Meu objetivo é mostrar ao usuário que o arquivo está sendo baixado, talvez até mesmo a velocidade, mas não estragar muito a aparência geral do script.

Importante: Minhas passagens do wget estão dentro de um script if else else, portanto, preciso manter a funcionalidade de detecção de erros.

Meu script tem um bloco parecido com:

if wget -O filename http://someurl then
    some_action
else
    some_other_action
fi

Alguém pode me fornecer alguns exemplos engraçados de dados ou barras de progresso personalizados com esses refinamentos? Obrigado;)

    
por user3450548 02.04.2016 / 17:38

1 resposta

4

Se você usa o estilo de saída de progresso "ponto", que é algo assim:

   500K .......... .......... .......... .......... ..........  2%  496K 91s

então você pode canalizar isso (que está no stderr) para awk ou similar e apenas imprimir o campo "2%" mostrado na última coluna.

wget ... --progress=dot -q --show-progress 2>&1 |
awk 'NF>2 && $(NF-2) ~ /%/{printf "\r %s",$(NF-2)} END{print "\r    "}'

Isso mostra a alteração do valor percentual em uma linha, que é apagada no final.

Para preservar o código de retorno de wget para um if..else , você pode solicitar ao bash que os pipelines retornem o código de erro de qualquer comando que falhou (em vez de apenas o comando mais à direita) definindo o script:

set -o pipefail

Alternativamente, você poderia colocar todo o código if..else..fi inalterado dentro de um bloco e canalizar o stderr no final em um único awk mais informativo como sugerido por cas nos comentários:

( if wget ...
  fi
  if wget ...
  fi
  if wget ...
  fi
) 2>&1 | awk '
/^Saving to:/ { fn = gensub(/^Saving to: /,"",1) }
NF>2 && $(NF-2) ~ /%/ { printf "\r%s %s",fn,$(NF-2) }
END { gsub(/./," ",fn); print "\r    " fn }'

ou para evitar a perda de mensagens de erro importantes no stderr, apenas redirecione o stderr em cada comando do wget para um terceiro descritor de arquivo:

( if wget ... 2>&3
  then ... else ... fi
  if wget ... 2>&3
  then ... else ... fi
  if wget ... 2>&3
  then ... else ... fi
) 3>&1 | awk ...
    
por 02.04.2016 / 19:46