2008-11-07 7 views
421

J'ai un répertoire web dans lequel je stocke des fichiers de configuration. Je voudrais utiliser wget pour retirer ces fichiers et maintenir leur structure actuelle. Par exemple, le répertoire distant ressemble à:Utiliser wget pour récupérer récursivement un répertoire avec des fichiers arbitraires

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

.vim contient plusieurs fichiers et répertoires. Je veux répliquer cela sur le client en utilisant wget. Impossible de trouver le bon combo de drapeaux wget pour y arriver. Des idées?

Répondre

727

Vous devez passer l'option -np/--no-parent à wget (en plus de -r/--recursive, bien sûr), sinon il suivez le lien dans l'index du répertoire sur mon site vers le répertoire parent. Ainsi, la commande ressemblerait à ceci:

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

Pour éviter de télécharger les fichiers générés automatiquement index.html, utilisez l'option -R/--reject:

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

ajoute -nH (supprime le nom d'hôte) --cut-dirs = X (supprime les répertoires X). C'est un peu ennuyeux d'avoir à compter manuellement les répertoires pour X. – lkraav

+1

Pourquoi aucune d'entre elles ne fonctionne pour http://www.w3.org/History/1991-WWW-NeXT/Implementation/? Il ne téléchargera que robots.txt – matteo

+18

@matteo car le fichier robots.txt n'autorise probablement pas l'exploration du site. Vous devez ajouter -e robots = off pour forcer l'exploration. – gaborous

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

fonctionne pour moi.

Peut-être avez-vous un .wgetrc qui interfère avec lui?

0

Vous devriez être en mesure de le faire en ajoutant simplement un -r

wget -r http://stackoverflow.com/ 
+8

Cela ne télécharge pas vraiment un répertoire, mais tous les fichiers qu'il peut trouver sur le serveur, y compris les répertoires au-dessus de celui que vous voulez télécharger. – Luc

103

Pour télécharger un répertoire récursive, qui rejette index.html * fichiers et téléchargements sans le nom d'hôte, le répertoire parent et la structure du répertoire entier:

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

Je n'arrive pas à faire fonctionner ceci: wget -r -nH --cut-dirs = 3 --non-parent --rejet = "index.html * "http://www.w3.org/History/1991-WWW-NeXT/Implementation/ --cut-dirs = 2 ne fonctionne pas non plus Il ne télécharge que le fichier robots.txt qui se trouve dans le dossier racine. Pourquoi ai-je disparu? – matteo

+26

@matteo essayez d'ajouter: -e robots = off – paulj

26

est ici la commande wget complète qui a fonctionné pour moi de télécharger des fichiers à partir du répertoire d'un serveur (en ignorant 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/ 
4

Si --no-parent pas d'aide, vous pouvez utiliser l'option --include.

struct Répertoire:

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

Et vous voulez télécharger downloads/good mais pas downloads/bad répertoire:

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

Vous devez utiliser le drapeau -m (miroir), car cela prend soin de ne pas gâcher avec des horodatages et de se répéter indéfiniment.

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

Si vous ajoutez les points mentionnés par d'autres dans ce fil, il serait:

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

Pour récupérer un répertoire récursive avec nom d'utilisateur et mot de passe, utilisez la commande suivante:

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

Wget 1.18 peut fonctionner mieux, par exemple, je me suis fait mordre par un bug de la version 1.12 où ...

wget --recursive (...) 

... récupère uniquement index.html au lieu de tous les fichiers. Contournement était de remarquer 301 redirections et essayer le nouvel emplacement - wget obtenu tous les fichiers dans le répertoire.

0

Cette version est téléchargée récursivement et ne crée pas de répertoires parents.

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

Utilisation:

  1. Ajouter à ~/.bashrc ou coller dans le terminal
  2. wgetod "http://example.com/x/"
0

Tout ce que vous avez besoin est deux drapeaux, l'un est "-r" pour récursivité et "--no-parent" (ou -np) afin de ne pas aller dans le '.' et "..". Comme ceci:

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

Voilà. Il sera téléchargé dans l'arborescence locale suivante: ./example.com/configs/.vim. Toutefois, si vous ne voulez pas que les deux premiers répertoires, puis utilisez le drapeau supplémentaire --cut-dirs=2 comme suggéré dans les réponses précédentes:

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

Et il téléchargera votre arborescence de fichiers que dans ./.vim/

En fait, J'ai obtenu la première ligne de cette réponse précisément à partir du wget manual, c'est un exemple très propre vers la fin de la section 4.3.

Questions connexes