Fazendo o download de vários URLs semelhantes usando chaves

1
#!/bin/sh
orig=$1

var=${orig%.jpg}
var='echo "$var" | grep -o "[0-9][0-9]$"'

cutten=${orig%[0-9][0-9].jpg}

sequence='{1,'
for i in 'seq 2 $(( $var - 1 ))'; do
sequence=$sequence$i","
done
output=$cutten$sequence$var"}.jpg"

echo "$output"
#wget "$output"

É preciso um link img, por exemplo: http://foo.bar/some-image-20.jpg e retorna %código%, isto é, arquivos * 1.jpg até * 20.jpg

Enquanto em echo ele funciona como esperado (a saída é como acima) quando executado com wget:

-- (Date/Time) -- http://foo.bar/some-image-%7B1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20%7D.jpg
(Proceeds to resolve this whole one link, and fails)

Substitui praticamente '{' por '% 7B' e '}' por '% 7D'. Alguma idéia?

    
por Konstantinos Toumpidis 27.09.2015 / 23:27

2 respostas

0

Não conheço nenhum servidor da Web que ofereça suporte a downloads com curingas. Você precisará buscar cada URL individualmente.

Manter o máximo possível do seu script original seria algo como:

#!/bin/sh
orig=$1

var=${orig%.jpg}
var=$(echo "$var" | grep -o "[0-9][0-9]$")

cutten=${orig%[0-9][0-9].jpg}

for i in $(seq 1 $(($var - 1))) ; do
      echo $cutten$i.jpg
done | wget -i -

Isso faz uso da opção -i do wget para ler uma lista de URLs para buscar a partir de um arquivo, neste caso stdin, para que possamos apenas canalizar a lista de arquivos para wget.

(se você quiser ver o que vai baixar antes de executá-lo, substitua wget -i - por cat )

    
por 28.09.2015 / 00:15
0

http://foo.bar/some-image-{1,2,3}.jpg é a sintaxe de origem do bash para representar a lista de palavras http://foo.bar/some-image-1.jpg , http://foo.bar/some-image-2.jpg , http://foo.bar/some-image-3.jpg . A sintaxe de origem significa que é algo que você digita no script, não é algo que acontece em uma expansão de variável. echo "$output" mostra o comando que você estará executando, que é

wget http://foo.bar/some-image-{1,2,3}.jpg

Como chaves não são válidas em URLs, wget as codifica como %7B e %7D . Isso não está relacionado ao seu problema: o servidor apenas vê uma URL contendo o que está relacionado a uma URL que não se refere a um arquivo existente.

Você precisa passar 3 (no meu exemplo, 20 no seu) URLs diferentes na linha de comando do wget. Você poderia usar eval para fazer bash analisar o conteúdo de uma variável como código-fonte para usar seu recurso de expansão de chave, mas seria mais fácil construir a lista em primeiro lugar - isso não é mais difícil do que construir a corda com as chaves.

#!/bin/sh
suffix=${1##*[0-9]}
prefix=${1%"$suffix"}
last=${prefix##*[!0-9]}
prefix=${prefix%"$last"}

while [ "$last" -gt 1 ]; do
  last=$((last-1))
  set -- "$prefix$last$suffix" "$@"
done

wget "$@"
    
por 28.09.2015 / 02:36