Dúvida com script para download automático [RESOLVIDO]

1. Dúvida com script para download automático [RESOLVIDO]

Bruno
bkammers

(usa Ubuntu)

Enviado em 19/04/2016 - 08:46h

Bom dia galera,

Venho quebrando a cabeça ultimamente, talvez alguém aqui possa me ajudar.

Criei um robô em shell para download de conteúdos num website. Consigo baixar normalmente, até aí tudo bem.

O problema é que, os arquivos nos links, possuem nomes aleatórios (ex: adfRfgg.PDF / 67JJke3d.PNG).

E ficam com este nome após o download. Faço a renomeação manualmente, mas quero automatizar.


Eu faço a lapidação da página com sed e grep até chegar nestes resultados:

Resultado1)

arquivoA - somente os links
arquivoB - somente os nomes

Neste caso, estão na mesma ordem. O link da 1ª linha no arquivoA, corresponde ao nome correto do arquivo na 1ª linha do arquivoB.


Resultado2)

Consigo gerar um único arquivo, com o link e nome sequencialmente:

arquivoC

Linha1 - LINK_A_xv56Ui990.PDF

Linha2 - NOME_CORRETO_ARQUIVO_A.PDF

Linha3 - LINK_B_p003ERT5x.PNG

Linha4 - NOME_CORRETO_ARQUIVO_B.PNG
...


Vamos a minha loucura:

Queria fazer o download do link com o nome correto.

Consigo jogar o output do wget numa varíavel e ela consultar o outro arquivo de forma var=$(var+1) ?

Ou então, no arquivo único, fazer o download da linha 1, com nomenclatura que estiver na linha 2. Depois download da linha 3, com nomenclatura da linha 4.


Acho que consegui expressar a dúvida do meu "quebra-cabeças".

Se alguém tem uma idéia de como fazer este esquema, agradeço.


  


2. Re: Dúvida com script para download automático [RESOLVIDO]

Ronaldo Ferreira de Lima
textmode

(usa Slackware)

Enviado em 19/04/2016 - 10:16h

Se for usar arquivoA e arquivoB:

Carregue ambos os arquivos cada um num array, usando o índice como formar relacionar ambos. Ficaria algo parecido com:


for (( i = 0; i <= ${#arrayA[*]}; i++ )); do
wget -O "${arrayB[$i]}" "${arrayA[$i]}"
done


Se for usar o arquivoC:
Faça o looping pelas linhas e separe nome e link em variáveis. Se você usar um separador melhor como o caractere de tabulação ao invés de ' - ', fica mais fácil separar. Exemplo:

while read line; do
nome=${line% -*}
link=${line#*- }
wget -O "$nome" "$link"
done < arquivoC



3. Re: Dúvida com script para download automático [RESOLVIDO]

Bruno
bkammers

(usa Ubuntu)

Enviado em 19/04/2016 - 18:32h

Utilizei o método para buscar num único arquivo e separar por variáveis, mas não deu certo.

As expressões utilizadas para $line, não são regexp né?

Procurei a sintaxe específica, mas não achei muita coisa pra me ajudar.

Está quase funcionando, só falta ajustar a parte onde separa as variáveis:


while read line
do
nome=${line% -*}
link=${line#*- }
wget -O "$nome" "$link"
done < arquivoC



{line% -*} e {line#*- }

Estas sintaxes queria entender melhor, acho que o ajuste nelas resolvem meu problema.
Tem algum material sobre estes recursos?


4. Re: Dúvida com script para download automático [RESOLVIDO]

Ronaldo Ferreira de Lima
textmode

(usa Slackware)

Enviado em 19/04/2016 - 19:32h

bkammers escreveu:

Utilizei o método para buscar num único arquivo e separar por variáveis, mas não deu certo.

As expressões utilizadas para $line, não são regexp né?

Procurei a sintaxe específica, mas não achei muita coisa pra me ajudar.

Está quase funcionando, só falta ajustar a parte onde separa as variáveis:


while read line
do
nome=${line% -*}
link=${line#*- }
wget -O "$nome" "$link"
done < arquivoC



{line% -*} e {line#*- }

Estas sintaxes queria entender melhor, acho que o ajuste nelas resolvem meu problema.
Tem algum material sobre estes recursos?


Só agora é que fui ver novamente o seu exemplo para arquivoC e o interpretei errado, lá você tem nas linhas ímpares o link e o nas linhas pares o nome do arquivo correto?

Mas antes, respondendo sua dúvida a respeito do
nome=${line% -*} 
e
link=${line#*- } 
, essas variáveis estão recebendo o resultado da expansão de parâmetros da variável linha, eu assumi que cada linha seria
nome do arquivo - link para download 
e que o separador da informação seria esse ' - ' (espaço, hífen, espaço), deste modo o
% -* 
retornaria a porção anterior ao separador e
#*- 
retornaria a porção final. Você vai achar no manual do bash, ksh, zsh etc como "Parameter Expansion" e tem vários exemplos interessantes inclusive na web, no info, você pode ir direto no
info bash 'Basic Shell Features' 'Shell Expansions' 'Shell Parameter Expansion' 
ou no
info zsh Expansion 'Parameter Expansion' 
. Essas expressões não são expressões regulares, são as regras para expansão de nomes de nomes de arquivo (glob) aplicadas em variáveis. Mas existe sim a possibilidade de utilizar regexps nesse caso aí também, minha recomendação é utilizar expressão regular apenas quando realmente necessário.

Voltando para o arquivoC, podemos manter o looping com while, lemos a linha ímpar e armazenamos na variável link, quando lermos a linha par, executaríamos o wget com ambos os valores. Mas tem forma mas simples, podemos usar o paste para juntar a linha ímpar com a par numa única, ficaria mais ou menos assim:


while IFS=$'\t\n' read link nome; do
echo wget -O "$nome" "$link"
done < <(paste - - < arquivoC)


Se tiver certeza que o comando está certo, aí você remove o 'echo'. Outra coisa, não pode existir caractere de tabulação no arquivoC.



5. Re: Dúvida com script para download automático [RESOLVIDO]

Bruno
bkammers

(usa Ubuntu)

Enviado em 19/04/2016 - 20:07h

Meu arquivo contém os links nas linhas ímpares e os nomes nas linhas pares.

Não havia entendido a sintaxe, também não sabia da sua existência.


Esta alteração que você passou, resolveu meu problema!



while IFS=$'\t\n' read link nome; do
echo wget -O "$nome" "$link"
done < <(paste - - < arquivoC)


RESOLVIDO!

Obrigado.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts