Baixar recursivamente links de um arquivo texto

Publicado por Perfil removido (última atualização em 04/07/2011)

[ Hits: 5.882 ]

Download pega.sh




Digamos que você queira/necessite baixar alguns MB/GB/TB da internet, por exemplo, para uma atualização, ou para a instalação de um novo programa usando uma conexão não muito apropriada para issso ou seja: lenta como a discada. Claro que isso vai demorar muito tempo, mais muito tempo mesmo. E pode ser que você não disponha de tempo o suficiente para ficar esperando o término da operação na frente do micro...

Como muitas outras pessoas (eu por exemplo), que ainda usam este tipo de conexão você aproveita a madrugada para baixar este tipo de arquivo ou um horário qualquer em que você não está a frente do micro em que ele normalmente é utilizado para outras tarefas e a já escassa banda disponível é essencial para a realização da mesma. E além do tempo gasto temos o famigerado consumo de energia elétrica.

Como exemplo inicial vou mostrar como baixar um pacote via apt-get (gerenciador de pacotes do Debian) usando um dos meus métodos.

NOTA: Digite tudo numa linha só caso queira usar as dicas em uma linha de comando. Eu usei esta formatação apenas para melhorar a leitura do código.

Primeiramente, o método que acho o mais correto de todos para instalar um pacote é você tentar baixar o pacote inteiro após verificar suas dependências. Claro, se todas estiverem resolvidas você poderá instala-las sem susto usando a dica a seguir:

    while : ; do

      sudo apt-get -d -y install pacote-foo &&

      sudo halt

    done


O parâmetro -d informa ao apt-get que ele deverá apenas baixar o pacote (armazena-lo no cache) para uma calma e posterior instalação. Note que fazemos uso de um loop infinito ( trecho while : ; do e done ) que só encerra quando o pacote for totalmente baixado, (graças ao &&), para então a maquina ser desligada ( halt ), caso não necessitarmos mais utiliza-la.

Veja que podemos usar o mesmo raciocínio para baixar qualquer arquivo usando o gerenciador de downloads wget que até hoje não senti sua falta em nenhuma distribuição GNU/Linux.

    while : ; do

      wget -c http://www.site_exemplo.com/exemplo.rar &&

      sudo halt

    done



Ou ainda usar algum tipo de sinalização do termino do download, como por exemplo tocar uma musica com um player como o mplayer.

    while : ; do

      wget -c http://www.site_exemplo.com/exemplo.rar &&

      mplayer  musica.ogg

    done



Me lembro de uma ocasião em que necessitei utilizar um outro gerenciador de download que "deixa arquivos .part" enquanto vai baixando o arquivo principal. Então usei algo assim:

    while [ -e ./*.part ] ; do

      echo -en " \rBaixando o arquivo..." && sleep 1s

    done &&

    sudo halt



E felizmente funcionou corretamente!!!

Enfim, as opções são muitas, uma vez que esse mesmo raciocínio pode ser usado para outros casos em que gastaríamos muito tempo esperando o termino de um processo e/ou para economizar energia necessitaríamos desligar o sistema ao termino do mesmo.

E como, neste tipo de caso, estamos impossibilitados de fazê-lo manualmente por estarmos no trabalho, escola ou talvez dormindo ou ainda nos divertindo com uma outra ocupação qualquer, este tipo de situação "adversa" torna a coisa muito difícil, senão impossível de fazê-lo de forma correta e blablablalbla

Estas são umas das principais soluções que encontrei para este tipo de problema e que me são de uma utilidade enorme, por serem muito simples e portanto facilmente assimiladas pela minha memória e ainda, extremamente convenientes principalmente por poder usa-las na linha de comando em qualquer sistema GNU/Linux sem me preocupar muito com versões e aptidões de programas gerenciadores de downloads.

Segue um script que aproveita estas idéias. Ele baixa recursivamente links de um arquivo texto.

Boa sorte.

  



Esconder código-fonte

#!/bin/bash
# Pega uma lista de links e os baixa um por um.
# Importante
# - Coloque um unico link por linha na lista.
# - Comentarios e linhas vazias não serão processados.
# - Coloque na ultima linha da lista de links para
# baixar a expressão exata THE END caso contrário
# o loop não encerará.
#
#
# Version 0.5a
# Author Paulo Riceli Dias Lelis (./.ronin)
# License GPLv2.0
# see more in http://pauloriceli.blogspot.com

PARA_BAIXAR="$PWD/pega.para_baixar.txt"
BAIXADOS="$PWD/pega.baixados.txt"
E_LST='THE END'
APP_NM='PEGA'
if [ ! -e $BAIXADOS ]; then
   touch $BAIXADOS
fi

if [ ! -e $PARA_BAIXAR ]; then
   echo >> $E_LST $PARA_BAIXAR
fi 

while : ; do
   IFS_O=$IFS
   IFS=$'\n'
   for i in $( grep -v '#' "${PARA_BAIXAR}" | uniq | grep -v '^$' ); do
      JA_FOI_BAIXADO=$( grep $i "${BAIXADOS}" )
      echo -e "${APP_NM}:\n Baixando \n $i...\n"
      if [ ${#JA_FOI_BAIXADO} -eq 0 -a $i != $E_LST ]; then
         wget -c $i &&
         echo $i >> "${BAIXADOS}"
      else
         echo -e "${APP_NM} :\n $i \n já foi baixado anteriormente. \n"
      fi
   done
   if [ $i == $E_LST ]; then
      IFS=$IFS_O
      break
   fi
done
exit

Scripts recomendados

Transformar eBook em Audiobook

Fazendo Backup de arquivos de micros em redes.

Cálculo de número primo

Hora certa - Observatório Nacional

Instalar o screenFetch em qualquer distribuição


  

Comentários
[1] Comentário enviado por chimico em 04/07/2011 - 08:30h

@./.ronin

Parabéns amigo, muito bom seu script. Está recheado de estruturas que preciso entender melhor.
Abraço
Fique com Deus


Contribuir com comentário