Gibt es eine Möglichkeit, wget daran zu hindern, Dateien aus übergeordneten Verzeichnissen auf eine bestimmte Tiefe abzurufen?

11

wget hat eine Option, die -npdas Abrufen von Dateien aus einem übergeordneten Verzeichnis deaktiviert. Ich brauche etwas Ähnliches, aber etwas flexibler. Erwägen:

www.foo.com/bar1/bar2/bar3/index.html

Ich möchte alles bekommen, aber nicht "höher" (in der Baumhierarchie) als bar2(!). Also bar2sollte auch geholt werden aber nicht bar1.

Gibt es eine Möglichkeit, wget selektiver zu machen?

Hintergrund: Ich versuche, eine Website mit einer ähnlichen logischen Struktur zu spiegeln - Ausgangspunkt, dann nach oben, dann nach unten. Wenn es ein anderes Tool gibt wget, das für ein solches Layout besser geeignet ist, lassen Sie es mich bitte ebenfalls wissen.

Aktualisieren

Oder anstatt eine mögliche Tiefe anzugeben, vielleicht so etwas wie "keine Eltern, es sei denn, sie stimmen mit dieser oder jener URL überein".

Update 2

Es gibt eine Struktur auf dem Server, oder? Sie können es als Baum visualisieren. Normalerweise beginnt man mit "--no-parent" an einem Punkt A und geht nur nach unten.

Mein Wunsch ist die Fähigkeit, nach oben zu gehen - ausgedrückt durch das Sagen, es ist erlaubt, X-Knoten zu steigen, oder (was 100% äquivalent ist), dass es erlaubt ist, bis zum B-Knoten zu steigen (wobei der Abstand BA = X ist).

In allen Fällen bleiben die Regeln für das Herunterfahren so, wie sie von den Benutzern definiert wurden (zum Beispiel - nur für Y-Ebenen).

Wie lagere ich es? Eigentlich ist es nicht wirklich die Frage - wgetstandardmäßig wird die Serverstruktur neu erstellt, hier gibt es nichts zu befürchten, oder es besteht keine Notwendigkeit, irgendetwas zu reparieren. Also in 2 Worten - wie immer.

Update 3

Verzeichnisstruktur unten - Nehmen wir an, dass in jedem Verzeichnis nur eine Datei vorhanden ist, in R - R.html und so weiter. Dies wird natürlich vereinfacht, da Sie mehr als eine Seite haben können.

        R 
       / \
      B   G
     / \
    C   F
   / \
  A   D
 /
E 

A (A.html) ist mein Ausgangspunkt, X = 2 (also ist B der Knoten der obersten Ebene, den ich abrufen möchte). In diesem Beispiel bedeutet dies, dass alle Seiten außer R.html und G.html abgerufen werden. A.html wird „Ausgangspunkt“ genannt , weil ich zu haben , von ihm zu starten, nicht von B.

Update 4

Die Benennung wird ab Update 3 verwendet.

wget OPTIONEN www.foo.com/B/C/A/A.html

Die Frage ist, welche Optionen es gibt, um alle Seiten aus Verzeichnis B und darunter abzurufen (in dem Wissen, dass Sie mit A.html beginnen müssen).

Greenoldman
quelle
Du willst bar2geholt aber nicht bar1? Wo wird bar2wohnen? Was ist, wenn zwei oder mehr Verzeichnisse, die Sie nicht möchten, Unterverzeichnisse mit identischen Namen haben, deren Inhalt zusammengeführt werden soll? Es ist mit ziemlicher Sicherheit einfacher, einfach die ganze verdammte Seite zu bekommen und dann die Dinge nach Belieben zu beschneiden / zu bewegen.
Kilian Foth
@ Kilian Foth, was meinst du mit "ganze verdammte Seite bekommen"? Hol es dir? Im Allgemeinen ist es übertrieben, es könnte bedeuten, TBs abzurufen, wenn MBs benötigt werden. Für den Rest siehe update2.
Greenoldman
Nicht sicher was du meinst. Die einzige Interpretation, die ich finden kann, ist, dass Sie das bar2Verzeichnis und seinen gesamten Inhalt wollen. Wenn dies nicht der Fall ist, klären Sie dies bitte.
Faheem Mitha
@Faheem Mitha, "sein Inhalt" = "gesamter Teilbaum". Ja, das ist nur eine Interpretation, die ich glaube, und genau das meine ich.
Greenoldman

Antworten:

12

Ich habe es nicht ausprobiert, aber mit -I und -X können Sie das bekommen, was Sie wollen. Meine ersten Versuche würden auf der Linie von sein

wget -m -I bar1/bar2 -X "*" http://www.foo.com/bar1/bar2/bar3/index.html

Erläuterung der Optionen:

-m: 
   --mirror
       Turn on options suitable for mirroring.  This option turns on recursion and time-stamping, sets
       infinite recursion depth and keeps FTP directory listings.  It is currently equivalent to -r -N -l
       inf --no-remove-listing.
-I: list
   --include-directories=list
       Specify a comma-separated list of directories you wish to follow when downloading.  Elements of
       list may contain wildcards.
-X: list
   --exclude-directories=list
       Specify a comma-separated list of directories you wish to exclude from download.  Elements of list
       may contain wildcards.
Ein Programmierer
quelle
4

Ich denke, die richtige Antwort ist hier die --no-parentOption:

   -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.
Jonathon Reinhart
quelle
Diese Flagge ist das genaue Gegenteil von dem, was OP will
EkriirkE
3

Sie müssen der URL ein endgültiges / hinzufügen, sonst erhalten Sie nicht das, was Sie wollen.

Wenn Sie den gesamten Inhalt unter www.myhostname.com/somedirectory abrufen möchten, sollte die Syntax wie folgt lauten:

wget -r -nH http://www.myhostname.com/somedirectory/

Versuchen Sie es ohne das Ende / und sehen Sie, was passiert. Dann versuchen Sie es mit dem /.

Adrian
quelle
1
Es wird immer noch in höhere Verzeichnisse aufsteigen, wenn die darin verlinkten Seiten auf solche verweisen
EkriirkE
Vielen Dank für den Hinweis mit dem abschließenden Schrägstrich! Es hat mir geholfen, das Problem mit irrelevanten Dateien zu lösen, die von wget aus benachbarten Verzeichnissen (Geschwistern) abgerufen wurden.
AntonK
1

Vielleicht fehlt mir etwas, aber wenn du das willst

wget -c -np -r www.foo.com/bar1/bar2

funktioniert für mich (anhand Ihres Beispiels). Mit diesen Optionen erhalten Sie natürlich auch die gesamte darüber liegende Verzeichnisstruktur von www.foo.comunten nach unten. Wenn Sie nur bar2auf höchstem Niveau wollen, dann tun Sie es

wget -c -np -r -nH --cut-dirs=1 www.foo.com/bar1/bar2

-nHwird das los www.foo.comund --cut-dirs=1wird los bar1, so dass Sie bar2und seine Unterverzeichnisse in das aktuelle Verzeichnis heruntergeladen werden. Weitere Informationen finden Sie man wgetunter gut lesbar und mit Beispielen.

Faheem Mitha
quelle
Sie haben den Ausgangspunkt weggelassen, Sie müssen den Links folgen. Sie haben angenommen, dass der Startpunkt gleichzeitig auf der obersten Ebene liegt (dies ist ein trivialer Fall von np), aber ich suche nach einer allgemeinen Lösung, wenn die oberste Ebene über dem Startpunkt liegt.
Greenoldman
@macias: Entschuldigung, ich folge dir nicht. Können Sie anhand eines Beispiels veranschaulichen?
Faheem Mitha
Ich habe gerade einen ASCII "Screenshot" hinzugefügt. Ich hoffe das wird helfen. In diesem Beispiel ist A der Ausgangspunkt.
Greenoldman
@macias: Sie möchten also nicht den Pfad zu B(gemäß Ihrem Beispiel) angeben , sondern A? Wenn ja warum? Liegt das daran, dass Sie ein Skript automatisieren möchten oder aus einem anderen Grund? Ich bin mir auch nicht sicher, was du mit X = 2 meinst. Bedeutet das Level 2? Wenn Sie versuchen, Verzeichnisse weiter unten im Baum abzurufen, bin ich mir nicht sicher, wie Sie sich Bvon diesen unterscheiden G.
Faheem Mitha
A ist der Ausgangspunkt, weil es der Ausgangspunkt ist - schauen Sie, ich bin auf der Clientseite, kein Server. IOW - Ich besitze den Server NICHT und habe diese Struktur nicht erstellt. Ich muss mit dem umgehen, was ich sehe. X ist das Symbol aus Update 2, die "Tiefe", um wie viele Ebenen Sie aufsteigen können. Sie unterscheiden B von G, weil B B ist und G nicht B, und Sie sehen B, weil es Teil der URL für A ist. Ich habe die Frage in Update 4
umformuliert.