Jak korzystać z wget z listą adresów URL i odpowiadających im plików wyjściowych?


35

Załóżmy, że list_of_urlswygląda to tak:

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

Wiem, jak tego używać z:

wget -i list_of_urls

Ale co, jeśli mój list_of_urlsma to i wszystkie zwracają odpowiednie pliki, takie jak pliki PDF lub filmy:

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

W przypadku pojedynczego pliku mógłbym to zrobić:

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

Jak mogę wgetpobrać tę listę adresów URL i zapisać zwrócone dane w odpowiednim pliku lokalnym?

Odpowiedzi:


33

Domyślnie wget zapisuje do pliku, którego nazwa jest ostatnim składnikiem adresu URL, który mu przekazujesz. Wiele serwerów przekierowuje adresy URL http://www.url1.com/app?q=123&gibb=erish&gar=blena inny adres URL o ładnie wyglądającej nazwie pliku http://download.url1.com/files/something.pdf. Możesz powiedzieć wgetowi, aby używał nazwy z przekierowanego adresu URL (tj. something.pdf), Zamiast app?q=123&gibb=erish&gar=bleprzekazywać --trust-server-namesopcję. To nie jest tryb domyślny, ponieważ jego nieostrożne użycie może doprowadzić do zastąpienia nieprzewidywalnej nazwy pliku w bieżącym katalogu; ale jeśli ufasz serwerowi lub pracujesz w katalogu nie zawierającym innych cennych plików, --trust-server-nameszwykle jest to właściwe rozwiązanie.

Niektóre serwery używają Content-Dispositionnagłówka zamiast przekierowania do określenia nazwy pliku. Przekaż --content-dispositionopcję, aby wget używał tej nazwy pliku.

A zatem:

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

Jeśli nadal nie otrzymujesz ładnie wyglądających nazw plików, możesz podać własne. Załóżmy, że masz plik zawierający linie takie jak

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

Aby wget pobrał pliki do podanych nazw plików, zakładając, że nie ma znaków spacji w adresie URL lub w nazwach plików:

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

errZmienna zawiera 0 jeśli wszystkie pliki do pobrania udało i 1 w przeciwnym razie, można return $err, jeśli umieścić ten fragment w funkcji lub exit $errjeśli umieścić ten fragment w ciąg.

Jeśli nie chcesz określać niczego poza adresami URL i nie możesz uzyskać ładnych nazw z serwera, możesz odgadnąć typ pliku i spróbować uzyskać co najmniej znaczące rozszerzenia.

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

Dodaj inne typy według potrzeb. Jeśli twoje filepolecenie nie ma takiej -mopcji, pomiń je i sprawdź, jakie filezwroty w twoim systemie dotyczą interesujących cię typów plików. Jeśli masz plik /etc/mime.typesw swoim systemie, możesz odczytać skojarzenia typów MIME z rozszerzeniami z zamiast dostarczać własną listę:

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

Możesz zapętlać wpisy w swoim list_of_urls. Coś takiego:

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

Pamiętaj, że musisz dodać własny sposób określania fookażdego wpisu list_of_urls(zakładam też, że jest to plik na dysku).


Oto jedna z odmian: utwórz mały skrypt z jedną linią wget -O $2 $1. W pliku list_of_urls ustaw każdą linię jako URL, spację, nazwę pliku (np http://url1/blah&blah=whatever some.pdf. Następnie użyj tego samego co powyżej, zastępując linię wget ./thatscript.sh $url. W tym przypadku $urljest to faktycznie linia z adresem URL i nazwą pliku, oczywiście.
goldilocks

2
Wariant 2: Umieść adresy URL i nazwy plików w osobnych, naprzemiennych wierszach w pliku list_of_urls, a następnie użyj while read url; do read filename; wget -O $filename $url; done < list_of_urls.
goldilocks,

2

Możesz bezpośrednio użyć wgetopcji:

wget -r -i list_of_urls

To nie działa: -rumożliwia pobieranie rekurencyjne. Nazwy plików nie są ustawione poprawnie.
jofel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.