Usando wget para buscar recursivamente un directorio con archivos arbitrarios
Pregunta
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. ¿Alguna idea?
Solución
Debe pasar la opción -np
/ --no-parent
a 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 archivos index.html
generados automáticamente, use la opción -R
/ --reject
:
wget -r -np -R "index.html*" http://example.com/configs/.vim/
Otros consejos
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
Para cualquier otra persona que tenga problemas similares. Wget sigue a robots.txt
que podría no permitirle acceder al sitio. No se preocupe, puede desactivarlo:
wget -e robots=off http://www.example.com/
http://www.gnu.org/software/wget/manual/html_node /Robot-Exclusion.html
Debe usar el indicador -m (espejo), ya que se encarga de no meterse con las 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/
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/
Si --no-parent
no ayuda, puede usar la opción --include
.
Estructura del directorio:
http://<host>/downloads/good
http://<host>/downloads/bad
Y desea descargar descargas / bueno
pero no el directorio downloads / bad
:
wget --include downloads/good --mirror --execute robots=off --no-host-directories --cut-dirs=1 --reject="index.html*" --continue http://<host>/downloads/good
wget -r http://mysite.com/configs/.vim/
funciona para mí.
¿Quizás tiene un .wgetrc que está interfiriendo con él?
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/
Todo lo que necesita es dos banderas, una es " -r "
para recursión y " - no-parent "
(o -np
) para no entrar en '.'
y " .. "
. Así:
wget -r --no-parent http://example.com/configs/.vim/
Eso es todo. Se descargará en el siguiente árbol local: ./example.com/configs/.vim
.
Sin embargo, si no desea los dos primeros directorios, utilice el indicador adicional --cut-dirs = 2
como 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 de wget manual , tienen un ejemplo muy claro hacia el final de la sección 4.3.
Debería poder hacerlo simplemente agregando un -r
wget -r http://stackoverflow.com/
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.
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:
- Añadir a
~ / .bashrc
o pegar en el terminal -
wgetod " http: //example.com/x/"