Wget'ı bir URL listesiyle ve bunlara karşılık gelen çıktı dosyalarıyla birlikte nasıl kullanırım?


35

Diyelim ki list_of_urlsşöyle görünüyor:

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

Bunu nasıl kullanacağımı biliyorum:

wget -i list_of_urls

Ancak, peki ya benim öyküm varsa list_of_urls, ve hepsi de PDF'ler veya videolar gibi uygun dosyaları verir:

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

Tek bir dosya için bunu yapabilirdim:

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

wgetBu URL listesini indirmek ve döndürülen verileri uygun yerel dosyaya kaydetmek için nasıl kullanırım ?

Yanıtlar:


33

Varsayılan olarak, wget, kendisine ilettiğiniz URL'nin son bileşeni olan adıyla bir dosyaya yazar. Pek çok sunucu, URL'leri http://www.url1.com/app?q=123&gibb=erish&gar=ble, hoş görünümlü bir dosya adı olan farklı bir URL'ye yönlendirir http://download.url1.com/files/something.pdf. Wget seçeneğini , seçeneği iletmek something.pdfyerine , yönlendirilen URL'den (yani ) kullanmasını söyleyebilirsiniz . Bu, varsayılan mod değildir, çünkü dikkatsizce kullanılırsa, geçerli dizindeki öngörülemeyen bir dosya adının üzerine yazılmasına neden olabilir; ancak sunucuya güveniyorsanız veya başka hiçbir değerli dosya içermeyen bir dizinde çalışıyorsanız , genellikle doğru olanı kullanın.app?q=123&gibb=erish&gar=ble--trust-server-names--trust-server-names

Bazı sunucular Content-Dispositionbir dosya adı belirtmek için yönlendirme yerine bir başlık kullanır. Geçiş --content-dispositionBu dosya adını kullanmak wget marka seçeneği.

Böylece:

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

Hala güzel görünen dosya adları alamıyorsanız, kendinizinkini belirtmek isteyebilirsiniz. Diyelim ki satırları içeren bir dosyanız var.

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

Wget’in dosyaları belirtilen dosya adlarına indirmesini sağlamak için, URL’de veya dosya adlarında boşluk karakteri olmadığını varsayarak:

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

errTüm indirme Başarsalardı ve 1 aksi yapabilirsiniz değişken 0 varsa return $errbir fonksiyonun içinde bu pasajı koymak veya eğer exit $errbir dizesinde bu pasajı koyarsanız.

URL'lerden başka bir şey belirtmek istemiyorsanız ve sunucudan hoş adlar alamıyorsanız, dosya türünü tahmin edebilir ve en azından anlamlı uzantılar almaya çalışabilirsiniz.

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

İstediğiniz diğer türleri ekleyin. Senin Eğer filekomut yok -mseçeneği, dışarı bırakın ve ne kontrol fileilgilendiğiniz dosya türleri için sisteminizde döner. Eğer bir dosyanız varsa /etc/mime.typessisteminizde, içinden uzantılarına MIME türlerinin ilişkilendirmeleri okuyabilir kendi listenizi sağlamak yerine:

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

İçindeki girişler üzerinde döngü olabilir list_of_urls. Bunun gibi bir şey:

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

fooHer giriş için kendi belirleme yönteminizi eklemek zorunda kalacağınızı unutmayın list_of_urls(ayrıca, bunun diskinizde bir dosya olduğunu farz ediyorum).


İşte bunun bir varyasyonu: tek satırlı küçük bir senaryo oluşturun wget -O $2 $1. List_of_urls dosyasında her satırı bir url, boşluk, bir dosya adı yapın (örn http://url1/blah&blah=whatever some.pdf. Sonra yukarıdakiyle aynı kullanın, wget satırını değiştirerek ./thatscript.sh $url. Bu durumda $urlaslında bir url ve bir dosya
adıyla

2
Varyasyon 2: URL'leri ve dosya adlarını list_of_urls dosyasına ayrı, alternatif satırlara koyun, sonra kullanın while read url; do read filename; wget -O $filename $url; done < list_of_urls.
goldilocks

2

Doğrudan wgetseçeneği kullanabilirsiniz :

wget -r -i list_of_urls

Bu çalışmaz: -rözyinelemeli indirme sağlar. Dosya adları doğru ayarlanmadı.
jofel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.