Utilisation de wget pour récupérer récursivement un répertoire contenant des fichiers arbitraires

573

J'ai un répertoire Web où je stocke des fichiers de configuration. Je voudrais utiliser wget pour tirer ces fichiers vers le bas et conserver leur structure actuelle. Par exemple, le répertoire distant ressemble à:

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 parvenir. Des idées?

jerodsanto
la source

Réponses:

988

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

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

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

wget -r -np -R "index.html*" http://example.com/configs/.vim/
Jeremy Ruten
la source
52
add -nH (supprime le nom d'hôte) --cut-dirs = X (supprime les répertoires X). c'est un peu ennuyeux de devoir compter manuellement les répertoires pour X ..
lkraav
3
Pourquoi aucun de ces éléments ne fonctionne-t-il pour w3.org/History/1991-WWW-NeXT/Implementation ? Il ne téléchargera que robots.txt
matteo
31
@matteo, car le fichier robots.txt interdit probablement l'exploration du site Web. Vous devez ajouter -e robots = off pour forcer l'exploration.
gaborous
ajouter -X / absolu / chemin / vers / dossier pour exclure un répertoire particulier
vishnu narayanan
3
Si vous ne souhaitez pas télécharger l'intégralité du contenu, vous pouvez utiliser: -l1 téléchargez simplement le répertoire (example.com dans votre cas) -l2 téléchargez le répertoire et tous les sous-dossiers de niveau 1 ('example.com/something' mais pas 'example.com/somthing/foo') Et ainsi de suite. Si vous n'insérez aucune option -l, wget utilisera automatiquement -l 5. Si vous insérez un -l 0, vous téléchargerez tout Internet, car wget suivra tous les liens qu'il trouve. stackoverflow.com/a/19695143/6785908
so-random-dude
123

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

wget -r -nH --cut-dirs=2 --no-parent --reject="index.html*" http://mysite.com/dir1/dir2/data
Sriram
la source
Je ne peux pas faire fonctionner ceci: wget -r -nH --cut-dirs = 3 --no-parent --reject = "index.html *" w3.org/History/1991-WWW-NeXT/Implementation - -cut-dirs = 2 ne fonctionne pas non plus. Il télécharge uniquement le fichier robots.txt qui se trouve réellement dans le dossier racine. Qu'est-ce qui me manque?
matteo
34
@matteo essayez d'ajouter: -e robots = off
Paul J
Pour obtenir récursivement tous les répertoires d'un répertoire, utilisez wget -r -nH --reject = "index.html *" mysite.io:1234/dir1/dir2
Prasanth Ganesan
115

Pour toute autre personne ayant des problèmes similaires. Wget suit robots.txtce qui pourrait ne pas vous permettre d'accéder au site. Pas de soucis, vous pouvez le désactiver:

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

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

Sean Villani
la source
Lorsque vous ignorez robots.txt, vous devez au moins limiter vos demandes. Le comportement suggéré dans cette réponse est très impoli.
Personne
@ Personne Alors, quelle est la réponse polie à cela?
Phani Rithvij
@PhaniRithvij Rate limite vos demandes, wget a des paramètres pour cela. Notez que certaines personnes peuvent toujours avoir des problèmes et que le fichier robots vous dit explicitement qu'il n'est pas autorisé à faire ce que vous faites actuellement, vous pourriez même avoir des problèmes juridiques.
Personne le
37

Vous devez utiliser le drapeau -m (miroir), car cela prend soin de ne pas jouer avec les horodatages et de récurer indéfiniment.

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

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

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

Voici la commande wget complète qui a fonctionné pour moi pour 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/
Erich Eichinger
la source
8

Sinon --no-parent, vous pouvez utiliser l' --includeoption.

Structure du répertoire:

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

Et vous souhaitez télécharger downloads/goodmais pas le downloads/badrépertoire:

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

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

travaille pour moi.

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

Conor McDermottroe
la source
5

Pour récupérer un répertoire récursivement 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/
Prayagupd
la source
2

Wget 1.18 peut mieux fonctionner, par exemple, j'ai été mordu par un bug de la version 1.12 où ...

wget --recursive (...)

... récupère uniquement index.html au lieu de tous les fichiers.

La solution de contournement consistait à remarquer quelques redirections 301 et à essayer le nouvel emplacement - étant donné la nouvelle URL, wget a obtenu tous les fichiers dans le répertoire.

devon
la source
2

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

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

C'est ça. Il téléchargera dans l'arbre local suivant: ./example.com/configs/.vim. Cependant, si vous ne voulez pas les deux premiers répertoires, utilisez l'indicateur supplémentaire --cut-dirs=2comme 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 uniquement dans ./.vim/

En fait, j'ai obtenu la première ligne de cette réponse précisément du manuel wget , ils ont un exemple très propre vers la fin de la section 4.3.

Jordan Gee
la source
2

L'option suivante semble être la combinaison parfaite en cas de téléchargement récursif:

wget -nd -np -P / dest / dir - récursif http: // url / dir1 / dir2

Extraits pertinents des pages de manuel pour plus de commodité:

   -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
la source
1

Vous devriez pouvoir le faire simplement en ajoutant un -r

wget -r http://stackoverflow.com/
kasperjj
la source
9
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 souhaitez télécharger.
Luc
1

Cette version se télécharge 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"
}

Usage:

  1. Ajouter ~/.bashrcou coller dans le terminal
  2. wgetod "http://example.com/x/"
rkok
la source