¿Hay alguna manera de deshabilitar wget de obtener archivos de directorios principales a una profundidad dada?

11

wget tiene la opción de -npdeshabilitar la obtención de archivos desde cualquier directorio padre. Necesito algo similar pero un poco más flexible. Considerar:

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

Me gustaría obtener todo pero no "más alto" (en la jerarquía del árbol) que bar2(!). Por bar2lo tanto , también debe buscarse pero no bar1.

¿Hay alguna manera de hacer que wget sea más selectivo?

Antecedentes: estoy tratando de reflejar un sitio web, con una estructura lógica similar: punto de partida, luego hacia arriba y luego hacia abajo. Si hay otra herramienta que wget, más adecuada para ese diseño, házmelo saber también.

Actualizar

O en lugar de especificar una posible profundidad, tal vez algo así como "sin padres, a menos que coincidan con esta o aquella URL".

Actualización 2

Hay alguna estructura en el servidor, ¿verdad? Puedes visualizarlo como un árbol. Entonces, normalmente con "--no-parent" comienzas desde algún punto A y bajas solo.

Mi deseo es la capacidad de subir: expresado al decir que está permitido subir a los nodos X, o (que es 100% equivalente) que está permitido subir al nodo B (donde la distancia BA = X).

En todos los casos, las reglas para bajar permanecen tal como fueron definidas por los usuarios (por ejemplo, baje solo por niveles Y).

¿Cómo almacenarlo? En realidad, no es la cuestión realmente: wgetde forma predeterminada, recrea la estructura del servidor, no hay nada que temer aquí, o no hay necesidad de arreglar nada. Entonces, en 2 palabras, como siempre.

Actualización 3

Estructura de directorio a continuación: supongamos que en cada directorio solo hay un archivo, en R - R.html, etc. Esto se simplifica, por supuesto, porque puede tener más de una página.

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

A (A.html) es mi punto de partida, X = 2 (por lo que B es el nodo de nivel más alto que me gustaría buscar). En este ejemplo particular, esto significa buscar todas las páginas excepto R.html y G.html. A.html se llama "punto de partida" porque tengo que comenzar desde él, no desde B.

Actualización 4

La denominación se utiliza desde la Actualización 3.

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

La pregunta es cuáles son las opciones para obtener todas las páginas del directorio B e inferior (sabiendo que debe comenzar desde A.html).

Greenoldman
fuente
¿Quieres bar2ir a buscar pero no bar1? ¿Dónde bar2va a residir? ¿Qué sucede si dos o más directorios que no desea tienen subdirectorios con nombres idénticos? ¿Deberían fusionarse sus contenidos? Es casi seguro que sea más fácil obtener todo el maldito sitio y luego podar / mover las cosas como lo desee.
Kilian Foth
@Kilian Foth, ¿Qué quieres decir con "obtener todo el maldito sitio"? ¿Obteniéndolo? En general, es excesivo, podría significar buscar TB cuando se necesitan MB. Para el resto, vea la actualización2.
greenoldman
No estoy seguro de lo que quieres decir. La única interprestación que se me ocurre es que quieres el bar2directorio y todo su contenido. Si no es así, por favor aclare.
Faheem Mitha
@Faheem Mitha, "its content" = "subárbol completo". Sí, creo que es solo interpretación, y eso es exactamente lo que quiero decir.
greenoldman

Respuestas:

12

No lo he probado, pero usar -I y -X podría darte lo que quieres. Mis primeros intentos serían a lo largo de la línea de

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

Explicación de opciones:

-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.
Un programador
fuente
4

Necesita agregar un final / a la URL, de lo contrario no obtendrá lo que desea.

Si desea obtener todo el contenido en www.myhostname.com/somedirectory , la sintaxis debería ser así:

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

Pruébelo sin el final / y vea qué sucede. Luego pruébalo con /.

Adrian
fuente
1
Todavía subirá al directorios más altas si las páginas enlazadas en el mismo se refieren a tales
EkriirkE
¡Muchas gracias por la pista con la barra inclinada final! Me ayudó a resolver el problema con archivos irrelevantes obtenidos por wget de directorios vecinos (hermanos).
AntonK
4

Creo que la respuesta correcta aquí es la --no-parentopció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.
Jonathon Reinhart
fuente
Esta bandera es exactamente lo contrario de lo que OP quiere
EkriirkE
1

Tal vez me estoy perdiendo algo, pero si eso es lo que quieres, entonces

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

funciona para mí (usando tu ejemplo). Por supuesto, con esas opciones obtendrá toda la estructura de directorios por encima de eso también, de www.foo.comabajo hacia abajo. Si solo quieres bar2al máximo nivel, entonces haz

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

-nHse deshace de él www.foo.comy --cut-dirs=1se deshace de él bar1, por lo que obtendrá bar2y sus subdirectorios se descargarán en el directorio actual. Para obtener más información, consulte man wget, que es bastante legible y tiene ejemplos.

Faheem Mitha
fuente
Omitió el punto de partida, debe seguir los enlaces. Asumiste que el punto de partida es al mismo tiempo de nivel superior (este es un caso trivial de np), pero estoy buscando una solución general, cuando el nivel superior está por encima del punto de partida.
greenoldman
@macias: Lo siento, no te estoy siguiendo. ¿Puedes ilustrar con un ejemplo?
Faheem Mitha
Acabo de agregar una "captura de pantalla" ASCII. Espero que esto sea de ayuda. En este ejemplo, A es el punto de partida.
greenoldman
@macias: ¿Entonces no desea especificar la ruta a B(según su ejemplo), sino más bien A? Si es así, ¿por qué? ¿Es esto porque quieres automatizar algún script o por alguna otra razón? Tampoco estoy seguro de lo que quieres decir con X = 2. ¿Eso significa nivel 2? Si usted está tratando a buscar directorios más abajo en el árbol, no estoy seguro de cómo distinguir Bentre G.
Faheem Mitha
A es el punto de partida, porque es el punto de partida. Mire, estoy del lado del cliente, no un servidor. IOW: NO soy dueño del servidor y no hice esta estructura. Tengo que lidiar con lo que veo. X es el símbolo de la Actualización 2, la "profundidad" de cuántos niveles puedes subir. Usted distingue a B de G, porque B es B y G no es B, y ve B, porque es parte de la URL para A. Reformé la pregunta en la Actualización 4.
greenoldman