Je dois télécharger un fichier à l'aide de 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 de désactiver et d'activer la globalisation lorsque vous traitez avec un site ftp, mais j'ai une URL http.
Comment puis-je utiliser un caractère générique tout en utilisant 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"
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.
$ wget -r --no-parent -A 'bar.*.tar.gz' http://url/dir/
Il y a une bonne raison pour laquelle cela ne peut pas fonctionner directement avec HTTP, et c'est qu'une URL n'est pas un chemin de fichier, bien que l'utilisation de /
comme un délimiteur peut le faire ressembler à un, et ils correspondent parfois.1
Classiquement (ou, historiquement), les serveurs Web reflètent souvent les hiérarchies de répertoires (pour certains - par exemple, Apache - c'est une sorte d'intégrale) et fournissent même des index de répertoires un peu comme un système de fichiers. Cependant, rien sur le protocole HTTP ne l'exige.
C'est important, car si vous voulez appliquer un glob sur disons, tout ce qui est un sous-chemin de http://foo/bar/
, à moins que le serveur ne fournisse un mécanisme pour vous en fournir (par exemple l'index susmentionné), il n'y a rien pour l'appliquer le glob à . Il n'y a pas de système de fichiers à rechercher. Par exemple, juste parce que vous savez qu'il y a des pages http://foo/bar/one.html
et http://foo/bar/two.html
ne signifie pas que vous pouvez obtenir une liste de fichiers et de sous-répertoires via http://foo/bar/
. Ce serait complètement dans le protocole que le serveur retourne 404 pour cela. Ou il pourrait renvoyer une liste de fichiers. Ou il pourrait vous envoyer une belle image jpg. Etc.
Il n'y a donc pas de standard que wget
puisse 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 récursivement http://foo/bar/index.html
il télécharge index.html
puis extrait les liens qui en sont un sous-chemin.2 Le -A
switch est simplement un filtre 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 également une URL. Cependant, bien que je ne sache pas grand-chose sur le protocole FTP, je suppose qu'en fonction de sa nature, il peut être d'une forme qui permet un regroupement transparent.
2. Cela signifie qu'il pourrait y avoir une URL valide http://foo/bar/alt/whatever/stuff/
que ne sera pas inclus car il n'est en aucune façon lié à quoi que ce soit dans l'ensemble des choses liées à 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, ni de le faire de manière intuitive.
La solution '-A pattern' ci-dessus peut ne pas fonctionner avec certaines pages Web. C'est ma solution, avec un double wget:
wget
la pagegrep
pour le motifwget
le ou les fichiersExemple: supposons que ce soit une page de podcast d'actualités et que je souhaite 5 fichiers mp3 en 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
grep
recherche des liens sans espace entre guillemets doubles contenant ://
et mon nom de fichier pattern
.
Utilisez l'option -nd pour enregistrer tous les fichiers dans le répertoire courant, sans hiérarchie de répertoires, exemple:
wget -r -nd --no-parent -A 'bar.*.tar.gz' http://url/dir/