Usando wget para buscar recursivamente un directorio con archivos arbitrarios


573

Tengo un directorio web donde almaceno algunos archivos de configuración. Me gustaría usar wget para extraer esos archivos y mantener su estructura actual. Por ejemplo, el directorio remoto se ve así:

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

.vim contiene múltiples archivos y directorios. Quiero replicar eso en el cliente usando wget. Parece que no puedo encontrar la combinación correcta de banderas wget para hacer esto. ¿Algunas ideas?

Respuestas:


988

Debe pasar la opción -np/ --no-parenta wget(además de -r/ --recursive, por supuesto), de lo contrario, seguirá el enlace en el índice del directorio de mi sitio al directorio principal. Entonces el comando se vería así:

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

Para evitar descargar los index.htmlarchivos generados automáticamente , use la opción -R/ --reject:

wget -r -np -R "index.html*" http://example.com/configs/.vim/

52
add -nH (corta el nombre del host) --cut-dirs = X (corta los directorios X). es un poco molesto tener que contar manualmente los directorios para X ..
lkraav

3
¿Por qué ninguno de estos funciona para w3.org/History/1991-WWW-NeXT/Implementation ? Solo descargará robots.txt
matteo

31
@matteo porque el archivo robots.txt probablemente no permita rastrear el sitio web. Debe agregar -e robots = off para forzar el rastreo.
Gaborous

agregue -X / absolute / path / to / folder para excluir un directorio en particular
vishnu narayanan

3
Si no desea descargar todo el contenido, puede usar: -l1 solo descargue el directorio (example.com en su caso) -l2 descargue el directorio y todas las subcarpetas de nivel 1 ('example.com/something' pero no 'example.com/somthing/foo') Y así sucesivamente. Si inserta la opción no -l, wget usará -l 5 automáticamente. Si inserta un -l 0, descargará todo Internet, porque wget seguirá cada enlace que encuentre. stackoverflow.com/a/19695143/6785908
so-random-dude

123

Para descargar un directorio de forma recursiva, que rechaza los archivos index.html * y las descargas sin el nombre de host, el directorio principal y la estructura completa del directorio:

wget -r -nH --cut-dirs=2 --no-parent --reject="index.html*" http://mysite.com/dir1/dir2/data

No puedo hacer que esto funcione: wget -r -nH --cut-dirs = 3 --no-parent --reject = "index.html *" w3.org/History/1991-WWW-NeXT/Implementation - -cut-dirs = 2 tampoco funciona. Solo descarga el archivo robots.txt que en realidad está en la carpeta raíz. ¿Dónde me estoy perdiendo?
matteo

34
@matteo intenta agregar: -e robots = apagado
Paul J

Para obtener recursivamente todos los directorios dentro de un directorio, use wget -r -nH --reject = "index.html *" mysite.io:1234/dir1/dir2
Prasanth Ganesan el

115

Para cualquier otra persona que tenga problemas similares. Wget sigue lo robots.txtque podría no permitirle tomar el sitio. No te preocupes, puedes apagarlo:

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

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


Cuando ignore el archivo robots.txt, al menos debe limitar sus solicitudes. El comportamiento sugerido en esta respuesta es muy descortés.
Nadie

@ Nadie Entonces, ¿cuál es la respuesta cortés a esto?
Phani Rithvij

@PhaniRithvij Rate limita tus solicitudes, wget tiene parámetros para ello. Tenga en cuenta que algunas personas aún pueden tener problemas, y teniendo en cuenta que el archivo de robots le dice explícitamente que no está permitido hacer lo que está haciendo actualmente, incluso podría tener problemas legales.
Nadie el

37

Debe usar el indicador -m (espejo), ya que se encarga de no meterse con marcas de tiempo y recurrir indefinidamente.

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

Si agrega los puntos mencionados por otros en este hilo, sería:

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

35

Aquí está el comando wget completo que me funcionó para descargar archivos del directorio de un servidor (ignorando 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/

8

Si --no-parentno ayuda, puede usar la --includeopción.

Estructura del directorio:

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

Y desea descargar downloads/goodpero no el downloads/baddirectorio:

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

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

funciona para mi.

¿Quizás tienes un .wgetrc que está interfiriendo con él?


5

Para buscar un directorio de forma recursiva con nombre de usuario y contraseña, use el siguiente comando:

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

2

Wget 1.18 puede funcionar mejor, por ejemplo, me mordió un error de la versión 1.12 donde ...

wget --recursive (...)

... solo recupera index.html en lugar de todos los archivos.

La solución consistía en notar algunos redireccionamientos 301 y probar la nueva ubicación: dada la nueva URL, wget obtuvo todos los archivos en el directorio.


2

Todo lo que necesitas son dos banderas, una es "-r"para recursión y "--no-parent"(o -np) para no ir en '.'y ".." . Me gusta esto:

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

Eso es. Se descarga en el siguiente árbol local: ./example.com/configs/.vim. Sin embargo, si no desea los dos primeros directorios, utilice el indicador adicional --cut-dirs=2como se sugiere en las respuestas anteriores:

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

Y descargará su árbol de archivos solo en ./.vim/

De hecho, obtuve la primera línea de esta respuesta precisamente del manual de wget , tienen un ejemplo muy claro hacia el final de la sección 4.3.


2

La siguiente opción parece ser la combinación perfecta cuando se trata de descargas recursivas:

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

Fragmentos relevantes de páginas de manual para mayor comodidad:

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

1

Debería poder hacerlo simplemente agregando un -r

wget -r http://stackoverflow.com/

99
Esto realmente no descarga un directorio, sino todos los archivos que puede encontrar en el servidor, incluidos los directorios superiores al que desea descargar.
Luc

1

Esta versión se descarga de forma recursiva y no crea directorios principales.

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"
}

Uso:

  1. Agregar ~/.bashrco pegar en la terminal
  2. wgetod "http://example.com/x/"
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.