Bagaimana cara saya menggunakan wget dengan daftar URL dan file output yang sesuai?

35

Misalkan list_of_urlsterlihat seperti ini:

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

Saya tahu cara menggunakannya dengan:

wget -i list_of_urls

Tapi, bagaimana jika saya list_of_urlspunya ini, dan mereka semua mengembalikan file yang tepat seperti PDF atau video:

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

Untuk satu file saya bisa melakukan ini:

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

Bagaimana cara saya gunakan wgetuntuk mengunduh daftar URL itu dan menyimpan data yang dikembalikan ke file lokal yang tepat?

Kit
sumber

Jawaban:

33

Secara default, wget menulis ke file yang namanya adalah komponen terakhir dari URL yang Anda berikan. Banyak server mengarahkan ulang URL http://www.url1.com/app?q=123&gibb=erish&gar=bleke URL yang berbeda dengan nama file yang terlihat bagus http://download.url1.com/files/something.pdf. Anda dapat memberi tahu wget untuk menggunakan nama dari URL yang dialihkan (yaitu something.pdf) alih-alih app?q=123&gibb=erish&gar=bledengan meneruskan --trust-server-namesopsi. Ini bukan mode default karena, jika digunakan secara sembarangan, ini dapat menyebabkan menimpa nama file yang tidak dapat diprediksi di direktori saat ini; tetapi jika Anda mempercayai server atau bekerja di direktori yang tidak mengandung file berharga lainnya, --trust-server-namesbiasanya hal yang tepat untuk digunakan.

Beberapa server menggunakan Content-Dispositionheader alih-alih pengalihan untuk menentukan nama file. Lulus --content-dispositionopsi untuk membuat wget menggunakan nama file ini.

Demikian:

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

Jika Anda masih tidak mendapatkan nama file yang terlihat bagus, Anda mungkin ingin menentukan sendiri. Misalkan Anda memiliki file yang berisi baris seperti

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

Untuk membuat wget mengunduh file ke nama file yang ditentukan, dengan asumsi tidak ada karakter spasi putih di URL atau dalam nama file:

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

The errvariabel mengandung 0 jika semua download berhasil dan 1 jika tidak, Anda dapat return $errjika Anda menempatkan potongan ini dalam fungsi atau exit $errjika Anda menempatkan potongan ini dalam sebuah string.

Jika Anda tidak ingin menentukan selain URL, dan Anda tidak bisa mendapatkan nama yang bagus dari server, Anda dapat menebak jenis file dan mencoba untuk mendapatkan setidaknya ekstensi yang berarti.

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

Tambahkan jenis lain yang diinginkan. Jika fileperintah Anda tidak memiliki -mopsi, tinggalkan, dan periksa apa yang filekembali pada sistem Anda untuk jenis file yang Anda minati. Jika Anda memiliki file /etc/mime.typesdi sistem Anda, Anda dapat membaca asosiasi tipe MIME untuk ekstensi dari alih-alih memasok daftar Anda sendiri:

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
Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Anda dapat mengulang entri di blog Anda list_of_urls. Sesuatu seperti ini:

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

Perhatikan bahwa Anda harus menambahkan cara Anda sendiri untuk menentukan foosetiap entri list_of_urls(juga, saya berasumsi ini adalah file pada disk Anda).

rahmu
sumber
Berikut variasi tentang itu: buat skrip kecil dengan satu baris wget -O $2 $1. Dalam file list_of_urls, buat setiap baris menjadi url, spasi putih, nama file (mis http://url1/blah&blah=whatever some.pdf. Kemudian gunakan yang sama seperti di atas, ganti baris wget dengan ./thatscript.sh $url. Dalam kasus $urlini sebenarnya adalah sebuah baris dengan url dan nama file, tentu saja
goldilocks
2
Variasi 2: Letakkan url dan nama file pada baris terpisah, berganti-ganti dalam file list_of_urls, lalu gunakan while read url; do read filename; wget -O $filename $url; done < list_of_urls.
goldilocks
2

Anda dapat langsung menggunakan wgetopsi:

wget -r -i list_of_urls
Steph
sumber
Ini tidak berfungsi: -rmengaktifkan unduhan berulang. Nama file tidak disetel dengan benar.
jofel