Faça o download do URL do arquivo CSV e renomeie o arquivo

1

Eu tenho um arquivo csv com 3 colunas como segue, eu preciso criar um arquivo em lotes para baixar as imagens nas URLs de um servidor FTP para uma pasta e renomeá-las para um novo nome da coluna A.

New_Name,URL,Status   
MyName1.jpg,ftp://images:[email protected]/images/image01.jpg,File Downloaded   
MyName2.jpg,ftp://images:[email protected]/images/image02.jpg,File Downloaded 
MyName3.jpg,ftp://images:[email protected]/images/image03.jpg,File Not Found

Seria realmente fantástico, se pudesse gravar o status do download de volta ao arquivo csv! Se o arquivo foi baixado com sucesso, ele escreveria "File Downloaded" na coluna C (Status), caso contrário ele escreveria "File Not Found".

Isso é possível?

Para começar, usei o script a seguir, chamado test.sh , emiti o comando sh test.sh no prompt de comando, apenas para fazer o download das URLs, sem nenhuma sorte!

#!/bin/sh   
for link in 'cat test.csv | cut -d, -f2'     
do   
     wget $link -O /mnt/nas_1tb/a-test/   
done

Eu encontrei o código acima de aqui .

    
por user2774042 17.08.2016 / 06:01

1 resposta

0

Você parece querer baixar o arquivo em um diretório específico. Você não pode fazer isso passando o nome do diretório para wget. Passe um nome de arquivo completo ou deixe o wget escolher o nome no link. Se wget escolher o nome, ele salvará o arquivo no diretório atual, portanto, mude para o diretório desejado primeiro.

Analisar a lista de URLs com uma substituição de comando é frágil. Pode falhar se os URLs contiverem ? e falharão se contiverem espaços. Você pode usar read para processar a lista linha por linha.

csv_file="$PWD/test.csv"
cd /mnt/nas_1tb/a-test/
while IFS=, read -r column1 url trail; do
  wget "$url"
done <"$csv_file"

Como você deseja escolher os nomes dos arquivos, deve passar a opção -O . Mas passe todo o nome do arquivo.

Para atualizar o status do download na terceira coluna, crie um novo arquivo com os dados atualizados.

while IFS=, read -r new_name url status; do
  wget -q -O "/mnt/nas_1tb/a-test/$new_name" "$url"
  case $? in
    0) status='File fownloaded';;
    8) status='File not found or server error';;
    *) status='Download failed';;
  esac
  printf '%s,%s,%s\n' "$new_name" "$url" "$status"
done <test.csv >test-results.csv

Observe que o wget não facilita a distinção entre "arquivo não encontrado" (HTTP 404) de outros erros (por exemplo, HTTP 403 não autorizado, erro interno do servidor HTTP 500, etc.). Mas, pelo menos, você recebe erros diferentes para erros quando o servidor não pode retornar uma resposta.

    
por 18.08.2016 / 03:44