C'è un modo per disabilitare wget dall'ottenere i file dalle directory principali a una certa profondità?


11

wget ha tale opzione -npche disabilita il recupero dei file da qualsiasi directory padre. Ho bisogno di qualcosa di simile ma un po 'più flessibile. Prendere in considerazione:

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

Vorrei ottenere tutto ma non "più in alto" (nella gerarchia degli alberi) di bar2(!). Quindi bar2dovrebbe anche essere recuperato ma non bar1.

C'è un modo per rendere wget più selettivo?

Sfondo: sto cercando di eseguire il mirroring di un sito Web, con una struttura logica simile: punto di partenza, quindi su, poi giù. Se esiste un altro strumento wget, più adatto a tale layout, per favore fatemelo sapere pure.

Aggiornare

O invece di specificare un approfondimento possibile, forse qualcosa del tipo "nessun genitore, a meno che non corrispondano a questo o quell'URL".

Aggiornamento 2

C'è una struttura sul server, giusto? Puoi visualizzarlo come un albero. Quindi normalmente con "--no-parent" inizi da un punto A e scendi solo verso il basso.

Il mio desiderio, è la capacità di salire - espresso dicendo che è consentito salire X nodi, o (che è equivalente al 100%) che è consentito salire fino al nodo B (dove la distanza BA = X).

In tutti i casi, le regole per scendere rimangono come definite dagli utenti (ad esempio, scendono solo per livelli Y).

Come conservarlo? In realtà non è davvero la domanda: wgetper impostazione predefinita ricrea la struttura del server, qui non c'è nulla di cui avere paura o non è necessario correggere nulla. Quindi, in 2 parole - come al solito.

Aggiornamento 3

Struttura della directory qui sotto - supponiamo che in ogni directory ci sia un solo file, in R - R.html e così via. Questo è ovviamente semplificato perché puoi avere più di una pagina.

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

A (A.html) è il mio punto di partenza, X = 2 (quindi B è il nodo di livello più alto che vorrei recuperare). In questo esempio particolare questo significa recuperare tutte le pagine tranne R.html e G.html. A.html è chiamato "punto di partenza" perché io devo cominciare da esso, non dalla B.

Aggiornamento 4

La denominazione viene utilizzata dall'aggiornamento 3.

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

La domanda è quali sono le opzioni per ottenere tutte le pagine dalla directory B e successive (sapendo che devi iniziare da A.html).


Vuoi bar2andare a prendere ma no bar1? Dove bar2risiederà? Cosa succede se due o più directory che non si desidera abbiano sottodirici identici, il loro contenuto dovrebbe essere unito? È quasi certamente più semplice ottenere l'intero sito dannato e quindi potare / spostare le cose come desideri.
Kilian Foth,

@Kilian Foth, cosa intendi con "ottenere l'intero sito dannato"? A prenderlo? In generale è eccessivo, potrebbe significare recuperare TB se sono necessari MB. Per il resto, vedi update2.
Greenoldman,

Non sono sicuro cosa intendi. L'unica interpretazione che posso inventare è che vuoi la bar2directory e tutto il suo contenuto. In caso contrario, chiarire.
Faheem Mitha,

@Faheem Mitha, "its content" = "whole subtree". Sì, questa è solo l'interpretazione che credo, ed è esattamente ciò che intendo.
Greenoldman,

Risposte:


12

Non l'ho provato, ma usare -I e -X potrebbe darti quello che vuoi. I miei primi tentativi sarebbero sulla falsariga di

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

Spiegazione delle opzioni:

-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.

4

Devi aggiungere un / finale all'URL, altrimenti non otterrai ciò che desideri.

Se si desidera ottenere tutto il contenuto su www.myhostname.com/somedirectory, la sintassi dovrebbe essere simile a:

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

Provalo senza fine / e guarda cosa succede. Quindi provalo con /.


1
Ascenderà comunque nelle directory superiori se le pagine collegate in esso si riferiscono a tali
EkriirkE

Grazie mille per il suggerimento con barra finale! Mi ha aiutato a risolvere il problema con file irrilevanti recuperati da wget da directory vicine (fratelli).
AntonK,

4

Penso che la risposta giusta qui sia l' --no-parentopzione:

   -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.

Questa bandiera è esattamente l'opposto di ciò che vuole OP
EkriirkE,

1

Forse mi manca qualcosa, ma se è quello che vuoi allora

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

funziona per me (usando il tuo esempio). Naturalmente, con queste opzioni otterrai anche tutta la struttura delle directory sopra, da www.foo.comgiù in giù. Se vuoi solo bar2al massimo livello, allora fallo

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

-nHsi sbarazza di www.foo.com, e --cut-dirs=1si libera di bar1, così si ottiene bar2e le sue sottodirectory scaricate nella directory corrente. Per ulteriori informazioni, vedere man wget, che è abbastanza leggibile e ha esempi.


È omesso punto di partenza, è necessario seguire i collegamenti. Hai supposto che il punto di partenza sia allo stesso tempo di livello superiore (questo è un caso banale di np), ma sto cercando una soluzione generale, quando il livello superiore è sopra il punto di partenza.
Greenoldman,

@macias: scusa, non ti sto seguendo. Puoi illustrare con un esempio?
Faheem Mitha,

Ho appena aggiunto uno "screenshot" ASCII. Spero che questo possa aiutare. In questo esempio A è il punto di partenza.
Greenoldman,

@macias: Quindi non vuoi specificare il percorso B(come nel tuo esempio), ma piuttosto A? Se è così, perché? È perché vuoi automatizzare alcuni script o per qualche altro motivo? Inoltre non sono sicuro di cosa intendi con X = 2. Significa livello 2? Se si sta tentando di recuperare le directory più in basso nella struttura, io non sono sicuro di come si fa a distinguere Bda G.
Faheem Mitha,

A è il punto di partenza, perché è il punto di partenza - guarda, io sono sul lato client, non un server. IOW - NON possiedo il server e non ho creato questa struttura. Devo affrontare ciò che vedo. X è il simbolo dell'aggiornamento 2, la "profondità" di quanti livelli puoi salire. Distingui B da G, perché B è B, e G non è B, e vedi B, perché fa parte dell'URL per A. Ho riformulato la domanda nell'aggiornamento 4.
Greenoldman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.