[Bash] Contador em While

Olá, estou com um empecilho em Shell Script, basicamente eu tenho um arquivo txt com uma lista com uma quantidade absurda de imagens(cerca de 15.000) e eu preciso baixar todas elas por wget, porém elas ficam fora de ordem devido a possuirem o nome baseado num GUID, e gostaria de renome-las de acordo com a ordem dela na lista, tentei utilizar um contador que se auto-soma a cada while, mas ele não se soma, então acaba reescrevendo o mesmo arquivo infinitas vezes, segue o código abaixo:

#!/bin/bash
i=1
while read url
do
i=$((i+1))
wget -i “$url” -O “$i.png”
done < input.txt
echo $i

O problema é o parâmetro -i. Do wget --help:

-i,  --input-file=ARQUIVO        baixa os URLs encontrados no ARQUIVO local ou
                                 externo

Ou seja, em vez de baixar o arquivo para ${i}.png, primeiro ele baixa o arquivo, tenta encontrar uma lista de URLs nele. Daí essas URLs que ele encontra no arquivo, ele tenta baixar e agrupar no arquivo especificado no -O. wget -i coisa -O saida equivale a:

wget coisa -O - | while read -r URL; do wget -q "$URL" -O -; done > saida

Tentar fazer o -i numa imagem (que por definição não tem URLs) gera sabe-se lá que tipo de erro que faz o wget recomeçar.

Simplesmente tirar o -i (deixar apenas wget "$url" -O "$i.png") vai provavelmente fazer o script funcionar.


Nota: o primeiro arquivo vai se chamar 2.png, já que você soma ao i antes de fazer wget.
E é bom trocar read por read -r. O read -r não tenta interpretar carecteres especiais (como \) apenas passa a saída bruta.

O contador funciona, até gera os arquivos de saida, porém sem nenhum bit.

": O esquema está faltando (URL)

Tudo explicado em comentários no script, em resumo, bastava omitir o -i

#!/usr/bin/env bash
i=1
# Evite separar o do do while, isso gera confusão
while read url; do
  # Sempre deixe o código identado
  # O parametro -i do wget espera um arquivo com uma lista,
  # logo como você está passando a URL, sempre omita  o parametro
  wget "${url}" -O "${i}.png"
  # Faça o incremento apenas no final, assim o primeiro arquivo 
  # será o arquivo 1
  i=$((i+1))
done < input.txt
 # Sempre chaveie suas variáveis assim: ${nome}
echo ${i}
3 Curtidas