Verwenden von wget zum rekursiven Abrufen eines Verzeichnisses mit beliebigen Dateien

573

Ich habe ein Webverzeichnis, in dem ich einige Konfigurationsdateien speichere. Ich möchte wget verwenden, um diese Dateien herunterzuziehen und ihre aktuelle Struktur beizubehalten. Das Remote-Verzeichnis sieht beispielsweise folgendermaßen aus:

http://mysite.com/configs/.vim/

.vim enthält mehrere Dateien und Verzeichnisse. Ich möchte das mit wget auf dem Client replizieren. Es scheint nicht die richtige Kombination von Wget-Flags zu finden, um dies zu erreichen. Irgendwelche Ideen?

Jerodsanto
quelle

Antworten:

988

Sie müssen die Option -np/ --no-parentan wget(zusätzlich zu -r/ --recursivenatürlich) übergeben, andernfalls folgt sie dem Link im Verzeichnisindex auf meiner Site zum übergeordneten Verzeichnis. Der Befehl würde also so aussehen:

wget --recursive --no-parent http://example.com/configs/.vim/

index.htmlVerwenden Sie die Option -R/, um das Herunterladen der automatisch generierten Dateien zu vermeiden --reject:

wget -r -np -R "index.html*" http://example.com/configs/.vim/
Jeremy Ruten
quelle
52
add -nH (schneidet Hostnamen aus) --cut-dirs = X (schneidet X-Verzeichnisse aus). Es ist ein bisschen ärgerlich, Verzeichnisse für X manuell zählen zu müssen.
lkraav
3
Warum funktioniert keines davon für w3.org/History/1991-WWW-NeXT/Implementation ? Es wird nur robots.txt
matteo
31
@matteo, weil die robots.txt das Crawlen der Website wahrscheinlich nicht zulässt. Sie sollten -e robots = off hinzufügen, um das Crawlen zu erzwingen.
gaborous
Fügen Sie -X / absolute / path / to / Ordner hinzu, um ein bestimmtes Verzeichnis auszuschließen
vishnu narayanan
3
Wenn Sie nicht den gesamten Inhalt herunterladen möchten, können Sie Folgendes verwenden: -l1 Laden Sie einfach das Verzeichnis herunter (in Ihrem Fall example.com) -l2 laden Sie das Verzeichnis und alle Unterordner der Ebene 1 herunter ('example.com/something', aber nicht 'example.com/somthing/foo') Und so weiter. Wenn Sie die Option -l einfügen, verwendet wget automatisch -l 5. Wenn Sie eine -l 0 einfügen, laden Sie das gesamte Internet herunter, da wget jedem gefundenen Link folgt. stackoverflow.com/a/19695143/6785908
so zufälliger Typ
123

So rekursiv ein Verzeichnis herunterladen, das index.html * -Dateien ablehnt und ohne den Hostnamen, das übergeordnete Verzeichnis und die gesamte Verzeichnisstruktur herunterlädt:

wget -r -nH --cut-dirs=2 --no-parent --reject="index.html*" http://mysite.com/dir1/dir2/data
Sriram
quelle
Ich kann das nicht zum Laufen bringen: wget -r -nH --cut-dirs = 3 --no-parent --reject = "index.html *" w3.org/History/1991-WWW-NeXT/Implementation - -cut-dirs = 2 funktioniert auch nicht. Es wird nur robots.txt heruntergeladen, das sich tatsächlich im Stammordner befindet. Was vermisse ich?
Matto
34
@ Matto versuchen, hinzuzufügen: -e Roboter = aus
Paul J
Um rekursiv alle Verzeichnisse in einem Verzeichnis abzurufen, verwenden Sie wget -r -nH --reject = "index.html *" mysite.io:1234/dir1/dir2
Prasanth Ganesan
115

Für alle anderen, die ähnliche Probleme haben. Es folgt Wget, mit robots.txtdem Sie die Site möglicherweise nicht abrufen können. Keine Sorge, Sie können es ausschalten:

wget -e robots=off http://www.example.com/

http://www.gnu.org/software/wget/manual/html_node/Robot-Exclusion.html

Sean Villani
quelle
Wenn Sie robots.txt ignorieren, sollten Sie zumindest Ihre Anforderungen drosseln. Das in dieser Antwort vorgeschlagene Verhalten ist sehr unhöflich.
Niemand
@Nobody Also, was ist die höfliche Antwort darauf?
Phani Rithvij
@PhaniRithvij Rate begrenzen Sie Ihre Anfragen, wget hat Parameter dafür. Beachten Sie, dass einige Leute möglicherweise immer noch Probleme haben. Wenn Sie in der Roboterdatei ausdrücklich darauf hinweisen, dass Sie nicht das tun dürfen, was Sie gerade tun, können Sie sogar rechtliche Probleme bekommen.
Niemand
37

Sie sollten das Flag -m (Spiegel) verwenden, da dies darauf achtet, nicht mit Zeitstempeln herumzuspielen und auf unbestimmte Zeit zu rekursieren.

wget -m http://example.com/configs/.vim/

Wenn Sie die von anderen in diesem Thread erwähnten Punkte hinzufügen, wäre dies:

wget -m -e robots=off --no-parent http://example.com/configs/.vim/
SamGoody
quelle
34

Hier ist der vollständige Befehl wget, mit dem ich Dateien aus dem Verzeichnis eines Servers heruntergeladen habe (ignoriert robots.txt):

wget -e robots=off --cut-dirs=3 --user-agent=Mozilla/5.0 --reject="index.html*" --no-parent --recursive --relative --level=1 --no-directories http://www.example.com/archive/example/5.3.0/
Erich Eichinger
quelle
8

Wenn Sie --no-parentnicht helfen, können Sie die --includeOption verwenden.

Verzeichnisstruktur:

http://<host>/downloads/good
http://<host>/downloads/bad

Und Sie möchten herunterladen, downloads/goodaber nicht downloads/badVerzeichnis:

wget --include downloads/good --mirror --execute robots=off --no-host-directories --cut-dirs=1 --reject="index.html*" --continue http://<host>/downloads/good

quelle
5
wget -r http://mysite.com/configs/.vim/

funktioniert bei mir.

Vielleicht haben Sie eine .wgetrc, die sie stört?

Conor McDermottroe
quelle
5

Verwenden Sie den folgenden Befehl, um ein Verzeichnis rekursiv mit Benutzername und Kennwort abzurufen:

wget -r --user=(put username here) --password='(put password here)' --no-parent http://example.com/
betet
quelle
2

Wget 1.18 funktioniert möglicherweise besser, z. B. wurde ich von einem Fehler in Version 1.12 gebissen, bei dem ...

wget --recursive (...)

... ruft nur index.html anstelle aller Dateien ab.

Die Problemumgehung bestand darin, 301 Weiterleitungen zu bemerken und den neuen Speicherort auszuprobieren. Angesichts der neuen URL erhielt wget alle Dateien im Verzeichnis.

Devon
quelle
2

Alles was Sie brauchen sind zwei Flags, eines ist "-r"für die Rekursion und "--no-parent"(oder -np) um nicht in das '.'und zu gehen ".." . So was:

wget -r --no-parent http://example.com/configs/.vim/

Das ist es. Es wird in den folgenden lokalen Baum heruntergeladen : ./example.com/configs/.vim. Wenn Sie jedoch die ersten beiden Verzeichnisse nicht möchten, verwenden Sie das zusätzliche Flag, --cut-dirs=2wie in früheren Antworten vorgeschlagen:

wget -r --no-parent --cut-dirs=2 http://example.com/configs/.vim/

Und es wird nur Ihren Dateibaum in herunterladen ./.vim/

Tatsächlich habe ich die erste Zeile aus dieser Antwort genau aus dem wget-Handbuch erhalten , sie haben gegen Ende von Abschnitt 4.3 ein sehr sauberes Beispiel.

Jordan Gee
quelle
2

Die folgende Option scheint die perfekte Kombination zu sein, wenn es um rekursiven Download geht:

wget -nd -np -P / dest / dir --rekursives http: // url / dir1 / dir2

Relevante Ausschnitte aus Manpages zur Vereinfachung:

   -nd
   --no-directories
       Do not create a hierarchy of directories when retrieving recursively.  With this option turned on, all files will get saved to the current directory, without clobbering (if a name shows up more than once, the
       filenames will get extensions .n).


   -np
   --no-parent
       Do not ever ascend to the parent directory when retrieving recursively.  This is a useful option, since it guarantees that only the files below a certain hierarchy will be downloaded.
pr-pal
quelle
1

Sie sollten dies einfach durch Hinzufügen eines -r tun können

wget -r http://stackoverflow.com/
kasperjj
quelle
9
Dadurch wird nicht wirklich ein Verzeichnis heruntergeladen, sondern alle Dateien, die auf dem Server gefunden werden können, einschließlich der Verzeichnisse über dem Verzeichnis, das Sie herunterladen möchten.
Luc
1

Diese Version wird rekursiv heruntergeladen und erstellt keine übergeordneten Verzeichnisse.

wgetod() {
    NSLASH="$(echo "$1" | perl -pe 's|.*://[^/]+(.*?)/?$|\1|' | grep -o / | wc -l)"
    NCUT=$((NSLASH > 0 ? NSLASH-1 : 0))
    wget -r -nH --user-agent=Mozilla/5.0 --cut-dirs=$NCUT --no-parent --reject="index.html*" "$1"
}

Verwendungszweck:

  1. Zum ~/.bashrcTerminal hinzufügen oder einfügen
  2. wgetod "http://example.com/x/"
rkok
quelle