wget avec des jokers dans les téléchargements http

53

J'ai besoin de télécharger un fichier en utilisant wget, mais je ne sais pas exactement quel sera le nom du fichier.

https://foo/bar.1234.tar.gz

Selon la page de manuel , wget vous permet d’activer et de désactiver la navigation lorsque vous traitez avec un site ftp, mais j’ai une URL http.

Comment utiliser un caractère générique avec un wget? J'utilise gnu wget.

Des choses que j'ai essayées.

/usr/local/bin/wget -r "https://foo/bar.*.tar.gz" -P /tmp

Mise à jour

L'utilisation de -A entraîne le téléchargement de tous les fichiers se terminant par .tar.gz sur le serveur.

/usr/local/bin/wget -r "https://foo/" -P /tmp -A "bar.*.tar.gz"

Mise à jour

D'après les réponses, c'est la syntaxe qui a finalement fonctionné.

/usr/local/bin/wget -r -l1 -np "https://foo" -P /tmp -A "bar*.tar.gz"
spuder
la source
2
Ce n'est pas exactement ce que vous cherchez, mais c'est lié: Curl a la capacité d'utiliser des caractères génériques de base, par exemple:curl "http://example.com/picture[1-10].jpg" -o "picture#1.jpg"
Hello World
1
Un des pièges pour moi a été le -e robots=offparamètre pour ne pas obéir à robots.txt: stackoverflow.com/a/11124664/1097104
Juuso Ohtonen
J'ai trouvé ajouter les drapeaux -nHet --cut-dirs=<number>a également été utile
Randall

Réponses:

62

Je pense que ces commutateurs feront ce que vous voulez avec wget:

   -A acclist --accept acclist
   -R rejlist --reject rejlist
       Specify comma-separated lists of file name suffixes or patterns to 
       accept or reject. Note that if any of the wildcard characters, *, ?,
       [ or ], appear in an element of acclist or rejlist, it will be 
       treated as a pattern, rather than a suffix.

   --accept-regex urlregex
   --reject-regex urlregex
       Specify a regular expression to accept or reject the complete URL.

Exemple

$ wget -r --no-parent -A 'bar.*.tar.gz' http://url/dir/
slm
la source
15

Il y a une bonne raison pour que cela ne fonctionne pas directement avec HTTP: une adresse URL n'est pas un chemin de fichier, bien que son utilisation en /tant que délimiteur puisse lui donner l'apparence d'un chemin et qu'elles correspondent parfois. 1

Traditionnellement (ou historiquement), les serveurs Web reproduisent souvent les hiérarchies de répertoires (pour certains, comme Apache, par exemple, cela fait partie intégrante) et fournissent même des index de répertoires similaires à ceux d'un système de fichiers. Cependant, rien dans le protocole HTTP ne l’exige.

Ceci est important, parce que si vous voulez appliquer un glob sur disons, tout ce qui est un sous - chemin http://foo/bar/, à moins que le serveur fournit un mécanisme pour vous fournir ces (par exemple l'indice précité), il n'y a rien à appliquer le glob à . Il n'y a pas de système de fichiers à rechercher. Par exemple, ce n'est pas parce que vous savez qu'il existe des pages http://foo/bar/one.htmlet http://foo/bar/two.htmlque vous pouvez obtenir une liste de fichiers et de sous-répertoires via http://foo/bar/. Il serait complètement dans le protocole pour le serveur de retourner 404 pour cela. Ou il pourrait retourner une liste de fichiers. Ou il pourrait vous envoyer une belle image jpg. Etc.

Donc, il n'y a pas de standard ici qui wgetpeut exploiter. AFAICT, wget fonctionne pour refléter une hiérarchie de chemins en examinant activement les liens dans chaque page . En d'autres termes, si vous mettez en miroir, de façon récursive, les http://foo/bar/index.htmltéléchargements index.html, puis extrayez les liens qui en sont un sous-chemin. 2 Le -Acommutateur est simplement un filtre qui est appliqué dans ce processus.

En bref, si vous savez que ces fichiers sont indexés quelque part, vous pouvez commencer par utiliser -A. Sinon, vous n'avez pas de chance.


1. Bien sûr, une URL FTP est aussi une URL. Cependant, bien que je connaisse mal le protocole FTP, j’imagine que, de par sa nature, il pourrait avoir une forme permettant une suppression transparente.

2. Cela signifie qu’il pourrait y avoir une URL valide http://foo/bar/alt/whatever/stuff/qui ne sera pas incluse car elle n’est en aucun cas liée à quoi que ce soit dans l’ensemble des éléments liés http://foo/bar/index.html. Contrairement aux systèmes de fichiers, les serveurs Web ne sont pas obligés de rendre la mise en page de leur contenu transparente, pas plus qu'ils ne doivent le faire de manière intuitivement évidente.

boucle d'or
la source
0

La solution '-A pattern' ci-dessus peut ne pas fonctionner avec certaines pages Web. Ceci est mon travail, avec un double wget:

  1. wget la page
  2. grep pour motif
  3. wget les fichiers)

Exemple: supposons que ce soit une page de podcast de nouvelles et que je veuille 5 fichiers mp3 du haut de la page:

wget -nv -O- https://example/page/ |
 grep -o '[^"[:space:]]*://[^"[:space:]]*pattern[^"[:space:]]*\.mp3' |
  head -n5 | while read x; do
    sleep $(($RANDOM % 5 + 5))  ## to appear gentle and polite
    wget -nv "$x"
  done

Le greprecherche des liens sans espace entre guillemets doubles ://et contenant mon nom de fichier pattern.

ronde de nuit
la source
qu'est-ce que RANDOM ici?
royki le
Une variable shell, voir la bashpage de manuel. RANDOM Chaque fois que ce paramètre est référencé, un entier aléatoire compris entre 0 et 32767 est généré.
Nighthift le