Acessando cada linha no arquivo .txt, baixe e renomeie links

2

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?

    
por Giorgos Perakis 04.07.2016 / 17:06

3 respostas

3

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
    
por 04.07.2016 / 17:53
2

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.

    
por 04.07.2016 / 17:51
0

Usando o awk:

awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt

Divida

  1. Primeiro usamos o awk para imprimir mais ou menos o comando que queremos:

    awk '{printf("wget -O %s %s\n", $1, $2)}' images.txt
    
  2. 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
    
  3. 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
    
por 04.07.2016 / 18:31