Wie verwende ich wget mit einer Liste von URLs und den zugehörigen Ausgabedateien?

35

Angenommen, list_of_urlssieht so aus:

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

Ich weiß, wie man das benutzt mit:

wget -i list_of_urls

Aber was ist, wenn meine das list_of_urlshat und alle die richtigen Dateien wie PDFs oder Videos zurückgeben:

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

Für eine einzelne Datei könnte ich dies tun:

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

Wie kann ich diese wgetURL-Liste herunterladen und die zurückgegebenen Daten in der richtigen lokalen Datei speichern?

Kit
quelle

Antworten:

33

Standardmäßig schreibt wget in eine Datei, deren Name die letzte Komponente der URL ist, die Sie an sie übergeben. Viele Server leiten URLs gerne http://www.url1.com/app?q=123&gibb=erish&gar=blezu einer anderen URL mit einem ansprechenden Dateinamen wie http://download.url1.com/files/something.pdf. Sie können wget anweisen, den Namen von der umgeleiteten URL (dh something.pdf) zu verwenden, anstatt app?q=123&gibb=erish&gar=bledie --trust-server-namesOption zu übergeben. Dies ist nicht der Standardmodus, da bei unsachgemäßer Verwendung ein unvorhersehbarer Dateiname im aktuellen Verzeichnis überschrieben werden kann. Aber wenn Sie dem Server vertrauen oder in einem Verzeichnis arbeiten, das keine anderen wertvollen Dateien enthält, --trust-server-namesist dies normalerweise die richtige Wahl.

Einige Server verwenden einen Content-DispositionHeader anstelle einer Umleitung, um einen Dateinamen anzugeben. Übergeben Sie die --content-dispositionOption, damit wget diesen Dateinamen verwendet.

Somit:

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

Wenn Sie immer noch keine ansprechenden Dateinamen erhalten, können Sie Ihre eigenen angeben. Angenommen, Sie haben eine Datei mit Zeilen wie

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

Damit wget die Dateien in die angegebenen Dateinamen herunterlädt, gehen Sie davon aus, dass die URL oder die Dateinamen keine Leerzeichen enthalten:

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

Die errVariable enthält 0, wenn alle Downloads erfolgreich waren, und 1, return $errwenn Sie dieses Snippet in eine Funktion oder exit $errdieses Snippet in eine Zeichenfolge einfügen.

Wenn Sie nur die URLs angeben möchten und keine netten Namen vom Server erhalten, können Sie den Dateityp erraten und versuchen, mindestens sinnvolle Erweiterungen zu erhalten.

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

Fügen Sie nach Bedarf weitere Typen hinzu. Wenn Ihr fileBefehl diese -mOption nicht bietet, lassen Sie sie weg und prüfen Sie, welche fileDateitypen /etc/mime.typesauf Ihrem System angezeigt werden . Wenn sich auf Ihrem System eine Datei befindet , können Sie Zuordnungen von MIME-Typen zu Erweiterungen lesen es anstatt Ihre eigene Liste zu liefern:

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 'SO - hör auf böse zu sein'
quelle
2

Sie könnten die Einträge in Ihrer Schleife durchlaufen list_of_urls. Etwas wie das:

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

Beachten Sie, dass Sie foofür jeden Eintrag der eine eigene Methode zum Bestimmen hinzufügen müssen list_of_urls(ich gehe auch davon aus, dass es sich um eine Datei auf Ihrer Festplatte handelt).

rahmu
quelle
Hier ist eine Variation davon: Erstelle ein kleines Skript mit einer Zeile wget -O $2 $1. Machen Sie in der Datei list_of_urls aus jeder Zeile eine URL, ein Leerzeichen und einen Dateinamen (z http://url1/blah&blah=whatever some.pdf. B. verwenden Sie dasselbe wie oben und ersetzen Sie die wget-Zeile durch ./thatscript.sh $url. In diesem Fall $urlhandelt es sich natürlich tatsächlich um eine Zeile mit einer URL und einem Dateinamen.
goldilocks
2
Variante 2: Setzen Sie die URLs und Dateinamen in separate, abwechselnde Zeilen in der Datei list_of_urls und verwenden Sie dann while read url; do read filename; wget -O $filename $url; done < list_of_urls.
Goldlöckchen
2

Sie können die wgetOption direkt verwenden :

wget -r -i list_of_urls
Steph
quelle
Dies funktioniert nicht: -rAktiviert den rekursiven Download. Die Dateinamen sind nicht richtig eingestellt.
Jofel