it-swarm.com.de

wget mit Platzhaltern in http-Downloads

Ich muss eine Datei mit wget herunterladen, weiß jedoch nicht genau, wie der Dateiname lauten wird.

https://foo/bar.1234.tar.gz

Laut Manpage können Sie mit wget das Globbing ein- und ausschalten, wenn Sie mit einer FTP-Site arbeiten. Ich habe jedoch eine http-URL.

Wie kann ich einen Platzhalter verwenden, während ich ein Wget verwende? Ich benutze gnu wget.

Dinge, die ich versucht habe.

/usr/local/bin/wget -r "https://foo/bar.*.tar.gz" -P /tmp

Update

Wenn Sie -A verwenden, werden alle Dateien, die auf dem Server mit .tar.gz enden, heruntergeladen.

/usr/local/bin/wget -r "https://foo/" -P /tmp -A "bar.*.tar.gz"

Update

Aus den Antworten geht hervor, dass dies die Syntax ist, die letztendlich funktioniert hat.

/usr/local/bin/wget -r -l1 -np "https://foo" -P /tmp -A "bar*.tar.gz"
61
spuder

Ich denke, diese Schalter werden mit wget tun, was Sie wollen:

   -A acclist --accept acclist
   -R rejlist --reject rejlist
       Specify comma-separated lists of file name suffixes or patterns to 
       accept or reject. Note that if any of the wildcard characters, *, ?,
       [ or ], appear in an element of acclist or rejlist, it will be 
       treated as a pattern, rather than a suffix.

   --accept-regex urlregex
   --reject-regex urlregex
       Specify a regular expression to accept or reject the complete URL.

Beispiel

$ wget -r --no-parent -A 'bar.*.tar.gz' http://url/dir/
69
slm

Es gibt einen guten Grund, warum dies nicht direkt mit HTTP funktioniert, und das ist, dass eine URL kein Dateipfad ist, obwohl die Verwendung von / Als Trennzeichen kann es so aussehen lassen, dass sie manchmal übereinstimmen.1

Herkömmlicherweise (oder historisch gesehen) spiegeln Webserver häufig Verzeichnishierarchien wider (für einige - z. B. Apache - ist dies eine Art Integral) und stellen sogar Verzeichnisindizes bereit, ähnlich wie bei einem Dateisystem. Dies erfordert jedoch nichts über das HTTP-Protokoll.

Dies ist von Bedeutung, denn wenn Sie beispielsweise einen Glob auf alles anwenden möchten, was ein Unterpfad von http://foo/bar/ Ist, müssen Sie nichts anwenden, es sei denn, der Server bietet einen Mechanismus, um Ihnen einen solchen (z. B. den oben genannten Index) bereitzustellen es ist der Globus zu . Es gibt dort kein zu durchsuchendes Dateisystem. Nur weil Sie wissen, dass es Seiten http://foo/bar/one.html Und http://foo/bar/two.html Gibt, heißt das nicht, dass Sie eine Liste von Dateien und Unterverzeichnissen erhalten können über http://foo/bar/. Es wäre vollständig im Protokoll, wenn der Server dafür 404 zurückgeben würde. Oder es könnte eine Liste von Dateien zurückgeben. Oder es könnte dir ein schönes JPG-Bild schicken. Usw.

Es gibt hier also keinen Standard, den wget ausnutzen kann. AFAICT, wget spiegelt eine Pfadhierarchie wider, indem Links auf jeder Seite aktiv untersucht werden . Mit anderen Worten, wenn Sie http://foo/bar/index.html Rekursiv spiegeln, wird index.html Heruntergeladen und anschließend Links extrahiert, die ein Unterpfad davon sind.2 Der Schalter -A Ist einfach ein Filter, der in diesem Prozess angewendet wird.

Kurz gesagt, wenn Sie wissen, dass diese Dateien irgendwo indiziert sind, können Sie damit mit -A Beginnen. Wenn nicht, haben Sie kein Glück.


1. Natürlich ist eine FTP-URL auch eine URL. Obwohl ich nicht viel über das FTP-Protokoll weiß, würde ich aufgrund seiner Natur vermuten, dass es eine Form hat, die transparentes Globbing ermöglicht.

2. Dies bedeutet, dass es eine gültige URL http://foo/bar/alt/whatever/stuff/ Geben könnte, die nicht enthalten ist , da sie in keiner Weise mit irgendetwas verknüpft ist in der Menge der Dinge, die mit http://foo/bar/index.html verknüpft sind. Im Gegensatz zu Dateisystemen sind Webserver weder verpflichtet, das Layout ihres Inhalts transparent zu machen, noch müssen sie dies auf intuitiv offensichtliche Weise tun.

17
goldilocks

Die obige Lösung "Ein Muster" funktioniert möglicherweise nicht mit einigen Webseiten. Dies ist meine Problemumgehung mit einem doppelten Wget:

  1. wget die Seite
  2. grep für Muster
  3. wget die Datei (en)

Beispiel: Angenommen, es handelt sich um eine Nachrichten-Podcast-Seite, und ich möchte 5 MP3-Dateien oben auf der Seite:

wget -nv -O- https://example/page/ |
 grep -o '[^"[:space:]]*://[^"[:space:]]*pattern[^"[:space:]]*\.mp3' |
  head -n5 | while read x; do
    sleep $(($RANDOM % 5 + 5))  ## to appear gentle and polite
    wget -nv "$x"
  done

Das grep sucht nach doppelten No-Space-Links, die :// und mein Dateiname pattern.

1
nightshift

Verwenden Sie die Option -nd, um alle Dateien im aktuellen Verzeichnis ohne Verzeichnishierarchie zu speichern. Beispiel:

wget -r -nd --no-parent -A 'bar.*.tar.gz' http://url/dir/
0
jasper