Isso pode fazer o seu trabalho,
while read a b
do
wget "$b" -O "$a".jpg
printf "$a".jpg"\n%s" >> newfile
done < images.txt
Digamos que eu tenha um arquivo .txt no qual tenho uma lista de links de imagem que desejo baixar. exemplo:
image.jpg
image2.jpg
image3.jpg
Eu uso: cat images.txt | xargs wget
e funciona muito bem
O que quero fazer agora é fornecer outro arquivo .txt com o seguinte formato:
some_id1 image.jpg
some_id2 image2.jpg
some_id3 image3.jpg
O que eu quero fazer é dividir cada linha no '', baixar o link à direita e alterar o nome do arquivo baixado com o ID fornecido à esquerda.
Eu quero usar wget image.jpg -O some_id1.jpg para cada linha separada.
Assim, a saída será:
some_id1.jpg
some_id2.jpg
some_id3.jpg
Alguma idéia?
Para testar:
$ awk '{ ext=gensub(/.*(\.[^.]*$)/,"\1",1);
print "wget " $2 " -O " $1 ext}' images.txt
wget image.jpg -O some_id1.jpg
wget image2.jpg -O some_id2.jpg
wget image3.jpg -O some_id3.jpg
Para executar, canalize para bash
ou sh
da seguinte forma:
awk '{ ext=gensub(/.*(\.[^.]*$)/,"\1",1);
print "wget " $2 " -O " $1 ext}' images.txt |
bash
Adicione aspas simples na declaração de impressão, se necessário (por exemplo, se os campos forem separados por guias e os campos puderem conter espaços ou outros caracteres problemáticos para o shell. ou se o campo 2 for um URL completo com e comercial &
, ponto e vírgula ;
etc). por exemplo,
awk '{ ext=gensub(/.*(\.[^.]*$)/,"\1",1);
print "wget '\''" $2 "'\'' -O '\''" $1 ext"'\''"}' images.txt
wget 'image.jpg' -O 'some_id1.jpg'
wget 'image2.jpg' -O 'some_id2.jpg'
wget 'image3.jpg' -O 'some_id3.jpg'
BTW, é assim que você incorpora aspas simples em strings com aspas simples: '\''
(finaliza aspas simples, uma aspas simples com escape de barra invertida, inicia aspas simples novamente)
Informação extra:
1. Talvez seja necessário fazer um processamento extra em $2
(com a função gsub()
do awk) antes da instrução print
, se houver alguma chance de que $ 2 possa conter um ou mais apóstrofos. por exemplo,
gsub(/'\''/,"'"'\\''"'",$2);
Essa confusão quase ilegível de aspas simples, aspas duplas, barras invertidas e barras invertidas transforma todos os '
s no segundo campo em '\''
. As citações podem ser uma dor real às vezes (embora não seja tão feio em um script #!/usr/bin/awk -f
do que em uma única linha com uma única citação).
2. Como alternativa, se $2
for uma URL, pode ser que valha a pena alterar aspas simples para %27
, que é a codificação da entidade de URL para um apóstrofo. O shell não se importa com símbolos%, certamente não se eles estiverem entre aspas simples, mas se preocupa muito com aspas.
Da mesma forma, você pode querer excluir todos os caracteres de pontuação ao extrair a extensão .extension. por exemplo,
ext=gensub(/.*(\.[^[:punct:]]*)/,"\1",1);
OBSERVE, no entanto, que isso pode ficar bastante complicado, dependendo de onde e como o nome do arquivo de imagem está incorporado, por exemplo, um URL.
Usando o awk:
awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt
Primeiro usamos o awk para imprimir mais ou menos o comando que queremos:
awk '{printf("wget -O %s %s\n", $1, $2)}' images.txt
Em seguida, extraímos a extensão dividindo a URL em '.' e anexá-lo ao primeiro argumento:
awk '{split($2, p, "."); printf("wget -O %s.%s %s\n", $1, p[length(p)], $2)}' images.txt
Finalmente, alteramos o printf para um sprintf e o wrap está em um comando do sistema para fazer com que o awk execute o comando:
awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt