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?

jerodsanto
fuente

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/
Jeremy Ruten
fuente
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
Sriram
fuente
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

Sean Villani
fuente
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/
SamGoody
fuente
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/
Erich Eichinger
fuente
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

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

funciona para mi.

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

Conor McDermottroe
fuente
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/
prayagupd
fuente
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.

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

Jordan Gee
fuente
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.
pr-pal
fuente
1

Debería poder hacerlo simplemente agregando un -r

wget -r http://stackoverflow.com/
kasperjj
fuente
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/"
rkok
fuente