Baixar recursivamente links de um arquivo texto

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

[ Hits: 5.640 ]

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

Balanceamento e Redundância utilizando 2 Links Speedy (ip fixo)

asbuild (Auto-SlackBuild)

KDE 4.1.1 no Slackware Linux 12.1

Iptables com Roteando via NAT

Leitor de RSS


  

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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts