wget con comodines en descargas http


53

Necesito descargar un archivo usando wget, sin embargo, no sé exactamente cuál será el nombre del archivo.

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

De acuerdo con la página de manual , wget le permite desactivar y activar el bloqueo cuando se trata de un sitio ftp, sin embargo, tengo una URL http.

¿Cómo puedo usar un comodín mientras uso un wget? Estoy usando gnu wget.

Cosas que he intentado.

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

Actualizar

El uso de -A hace que se descarguen todos los archivos que terminan en .tar.gz en el servidor.

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

Actualizar

De las respuestas, esta es la sintaxis que finalmente funcionó.

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

2
Esto no es exactamente lo que está buscando, pero está relacionado: Curl tiene la capacidad de usar comodines básicos, por ejemplo:curl "http://example.com/picture[1-10].jpg" -o "picture#1.jpg"
Hello World,

1
Un problema para mí fue el -e robots=offparámetro para no obedecer robots.txt: stackoverflow.com/a/11124664/1097104
Juuso Ohtonen

Encontré agregar las banderas -nHy --cut-dirs=<number>también fue útil
Randall

Respuestas:


62

Creo que estos interruptores harán lo que quieras con wget:

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

Ejemplo

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

15

Hay una buena razón por la que esto no puede funcionar directamente con HTTP, y es que una URL no es una ruta de archivo, aunque el uso /como delimitador puede hacer que parezca una, y a veces se corresponden. 1

Convencionalmente (o, históricamente), los servidores web a menudo hacen jerarquías de directorios espejo (para algunos, por ejemplo, Apache, esto es una especie de integral) e incluso proporcionan índices de directorio como un sistema de archivos. Sin embargo, nada sobre el protocolo HTTP requiere esto.

Esto es significativo, ya que si se desea aplicar un pegote en decir, todo lo que es una subruta de http://foo/bar/, a menos que el servidor proporciona un mecanismo para ofrecerle tales (por ejemplo, el índice antes mencionado), no hay nada para aplicarla al pegote a . No hay un sistema de archivos allí para buscar. Por ejemplo, solo porque sabe que hay páginas http://foo/bar/one.htmly http://foo/bar/two.htmlno significa que pueda obtener una lista de archivos y subdirectorios a través de http://foo/bar/. Sería completamente dentro del protocolo que el servidor devuelva 404 para eso. O podría devolver una lista de archivos. O podría enviarte una buena foto jpg. Etc.

Entonces, no hay un estándar aquí que wgetpueda explotar. AFAICT, wget trabaja para reflejar una jerarquía de ruta examinando activamente los enlaces en cada página . En otras palabras, si lo refleja de forma recursiva, http://foo/bar/index.htmlse descarga index.htmly luego extrae los enlaces que son una ruta secundaria de eso. 2 El -Ainterruptor es simplemente un filtro que se aplica en este proceso.

En resumen, si sabe que estos archivos están indexados en alguna parte, puede comenzar con eso usando -A. Si no, entonces no tienes suerte.


1. Por supuesto, una URL FTP también es una URL. Sin embargo, si bien no sé mucho sobre el protocolo FTP, supongo que, debido a su naturaleza, puede ser de una forma que permita el bloqueo transparente.

2. Esto significa que podría haber una URL válida http://foo/bar/alt/whatever/stuff/que no se incluirá porque de ninguna manera está vinculada a nada en el conjunto de cosas vinculadas http://foo/bar/index.html. A diferencia de los sistemas de archivos, los servidores web no están obligados a hacer que el diseño de su contenido sea transparente, ni necesitan hacerlo de una manera intuitivamente obvia.


0

La solución anterior '-A pattern' puede no funcionar con algunas páginas web. Esta es mi solución, con un doble wget:

  1. wget la página
  2. grep para el patrón
  3. wget Los archivos)

Ejemplo: supongamos que es una página de podcast de noticias, y quiero 5 archivos mp3 desde la parte superior de la página:

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

El grepestá buscando enlaces sin espacio entre comillas dobles que contienen ://y mi nombre de archivo pattern.


¿Qué es al azar aquí?
Royki

Una variable de shell, vea la bashpágina del manual. ALEATORIO Cada vez que se hace referencia a este parámetro, se genera un entero aleatorio entre 0 y 32767.
turno de noche el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.