Come posso usare wget con un elenco di URL e i loro file di output corrispondenti?


35

Supponiamo che list_of_urlsassomigli a questo:

http://www.url1.com/some.txt
http://www.url2.com/video.mp4

So come usarlo con:

wget -i list_of_urls

Ma cosa succede se il mio list_of_urlsha questo, e tutti restituiscono file corretti come PDF o video:

http://www.url1.com/app?q=123&gibb=erish&gar=ble
http://www.url2.com/app?q=111&wha=tcha&mac=allit

Per un singolo file potrei fare questo:

wget -O some.txt "http://www.url1.com/app?q=123&gibb=erish&gar=ble"

Come si usa wgetper scaricare quell'elenco di URL e salvare i dati restituiti nel file locale corretto?

Risposte:


33

Per impostazione predefinita, wget scrive su un file il cui nome è l'ultimo componente dell'URL che gli viene passato. Molti server reindirizzano gli URL come http://www.url1.com/app?q=123&gibb=erish&gar=blea un URL diverso con un nome file gradevole come http://download.url1.com/files/something.pdf. Puoi dire a wget di usare il nome dall'URL reindirizzato (ad es. something.pdf) Invece di app?q=123&gibb=erish&gar=blepassare l' --trust-server-namesopzione. Questa non è la modalità predefinita perché, se usata con noncuranza, potrebbe portare a sovrascrivere un nome di file imprevedibile nella directory corrente; ma se ti fidi del server o stai lavorando in una directory che non contiene altri file preziosi, di --trust-server-namessolito è la cosa giusta da usare.

Alcuni server utilizzano Content-Dispositionun'intestazione anziché il reindirizzamento per specificare un nome file. Passa l' --content-dispositionopzione per fare in modo che wget usi questo nome file.

Così:

wget --content-disposition --trust-server-names -i list_of_urls

Se non stai ancora ottenendo nomi di file di bell'aspetto, potresti voler specificare i tuoi. Supponiamo di avere un file contenente righe come

http://www.url1.com/app?q=123&gibb=erish&gar=ble foo.pdf
http://www.url2.com/app?q=111&wha=tcha&mac=allit bar.txt

Per fare in modo che wget scarichi i file nei nomi file specificati, supponendo che non vi siano caratteri spazi bianchi nell'URL o nei nomi file:

err=0
while read -r url filename tail; do
  wget -O "$filename" "$url" || err=1
done <list_of_urls_and_file_names

La errvariabile contiene 0 se tutti i download hanno avuto esito positivo e 1 in caso contrario, puoi return $errinserire questo snippet in una funzione o exit $errinserire questo snippet in una stringa.

Se non si desidera specificare altro che gli URL e non è possibile ottenere nomi carini dal server, è possibile indovinare il tipo di file e tentare di ottenere estensioni almeno significative.

err=0
n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    ext=data
    case $(file -i tmpfile) in
      application/pdf) ext=pdf;;
      image/jpeg) ext=jpg;;
      text/html) ext=html;;
      text/*) ext=txt;;
    esac
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done

Aggiungi altri tipi come desiderato. Se il tuo filecomando non ha l' -mopzione, lascialo fuori e controlla cosa fileritorna sul tuo sistema per i tipi di file che ti interessano. Se hai un file /etc/mime.typessul tuo sistema, puoi leggere le associazioni dei tipi MIME alle estensioni da invece di fornire il tuo elenco:

n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    mime_type=$(file -m tmpfile)
    ext=$(awk "$1 == \"$mime_type\" {print \$2; exit} END {print \"data\"}" /etc/mime.types)
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done

2

È possibile scorrere le voci nel tuo list_of_urls. Qualcosa come questo:

while read -r url; do
    wget -O foo $url
done < list_of_urls

Nota che dovrai aggiungere il tuo modo di determinare fooper ogni voce del list_of_urls(anche, presumo che questo sia un file sul tuo disco).


Ecco una variazione al riguardo: crea un piccolo script con una riga wget -O $2 $1. Nel file list_of_urls, trasforma ogni riga in un url, uno spazio bianco, un nome di file (ad es http://url1/blah&blah=whatever some.pdf. Quindi usa lo stesso come sopra, sostituendo la linea di wget con ./thatscript.sh $url. In questo caso $urlè in realtà una linea con un url e un nome di file, ovviamente.
goldilocks

2
Variazione 2: inserisci gli URL e i nomi dei file su righe separate e alternate nel file list_of_urls, quindi usa while read url; do read filename; wget -O $filename $url; done < list_of_urls.
Riccioli d'oro

2

Puoi usare direttamente l' wgetopzione:

wget -r -i list_of_urls

Questo non funziona: -rabilita il download ricorsivo. I nomi dei file non sono impostati correttamente.
jofel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.