Prenons le cas pratique suivant : vous voulez télécharger des photos sur un serveur web (une bonne centaine), sans passer par un logiciel de type usine à gaz et sans faire l'autiste en cliquant 100 fois sur un lien (ou en tapant 100 fois la même commande pour ne pas oublier les accros du mode console, même si à mon avis ces derniers sont bien au-dessus de la simplicité de ce script) pour enregistrer l'image. La solution proposée ici met en oeuvre wget dans une boucle for de base.
Comme je travaille sous OpenBSD, je préfère préciser que ce script est probablement compatible avec tous les UNIX pas trop exotiques. En effet, il n'utilise pas de commandes spécifiques GNU/Linux comme seq qui permet de sortir une séquence de nombres et qui est souvent utilisé avec les boucles for (NdM : la commande seqUsage: seq [OPTION]... DERNIER
fait partie du package GNU shellutils). Du coup, le code est parfois un peu tiré par les cheveux. Cela dit, rien ne vous empêche de modifier un peu le code pour en simplifier la structure.
ou: seq [OPTION]... PERMIER DERNIER
ou: seq [OPTION]... PREMIER INCRÉMENT DERNIER
Afficher les nombres du PREMIER jusqu'au DERNIER,
selon le PAS d'incrémentation.
Par contre je ne garantis pas que certaines structures comme l'utilisation de parenthèses au lieu de crochets dans les tests des structures conditionnelles ne pose pas quelques problèmes sous GNU/Linux (Je n'ai pas de machine sous la main pour m'en assurer).
Le shell utilisé pour ce script est tout simplement sh.
Pour tester ce script, il vous faut simplement un éditeur de texte comme vi/vim, emacs ou encore nano pour écrire les commandes dans un fichier .sh. Une fois le fichier créé, il suffit de le rendre exécutable à l'aide de la commande chmodUsage: chmod [OPTION]... MODE[,MODE]... FICHIER...
. Ainsi, pour rendre exécutable le fichier de script downloader.sh, vous taperez la commande
ou: chmod [OPTION]... MODE-OCTAL FICHIER
ou: chmod [OPTION]... --reference=FICHIER-R FICHIER
Changer le mode de chaque fichier selon le MODE choisi.chmod +x downloader.shUsage: chmod [OPTION]... MODE[,MODE]... FICHIER...
.
ou: chmod [OPTION]... MODE-OCTAL FICHIER
ou: chmod [OPTION]... --reference=FICHIER-R FICHIER
Changer le mode de chaque fichier selon le MODE choisi.
Dans un premier temps, nous allons simplement écrire la plupart du code en dur pour arriver à notre fin. Il s'agit de mettre la commande wgetGNU Wget 1.10.2, un récupérateur réseau non interactif.
dans une structure de boucle (do en l'occurence) pour automatiser le téléchargement d'une suite de fichiers dont la règle de nommage utilise une séquence de nombres.
Usage: wget [OPTION]... [URL]...
Supposons que nous souhaitions télécharger les photos nommées IMG0102.JPG à IMG0193.JPG à l'adresse http://www.adresse.com/photos/. Pour faire cela nous écrivons une boucle do qui met en oeuvre la commande wget http://www.adresse.com/photos/IMG0xx.JPGGNU Wget 1.10.2, un récupérateur réseau non interactif.
autant de fois que nécessaire, en changeant xx à chaque tour dans la boucle. Voici ce que ça donne :
Usage: wget [OPTION]... [URL]...
#!/usr/local/bin/bash $i=102 while test $i -le $193 do wget http://www.adresse.com/photos/IMG0$min.JPG i=$(( $i + 1 )) done
Ce script rendra son service mais est limité en souplesse de réutilisation : Il faudra à chaque fois en modifier le code source pour l'adapter à chacun des cas de téléchargement multiple que nous souhaiterons mettre en oeuvre.
Nous reprenons l'idée précédente de boucle en améliorant la souplesse du code. L'idée ici est de passer en argument les deux bornes minimum et maximum des fichiers à télécharger, ainsi que le début et la fin de la chaîne de caractères. Dans notre cas, les arguments que nous souhaiterions passer seront donc :
Comme nous utilisons des arguments dans notre code, nous peaufinerons au passage l'interactivité du script en vérifiant le nombre d'arguments passés à l'exécution et en affichant un message d'aide si ce nombre est incorrect (le fameux USAGE:). Voici donc le code final :
#!/usr/local/bin/bash if (test -z $1) && (test -z $2) && (test -z $3) && (test -z $4) then echo "Usage: $0 url id_min id_max extension" exit fi url=$(($1)) min=$(($2 + 0)) max=$(($3 + 0)) ext=$(($4)) while test $min -le $max do wget $1$min$4 min=$(( $min + 1 )) done
Documentation sous licence GNU/Free Documentation Licence version 1.2
http://www.gnu.org/copyleft/fdl.html
Christophe Eyquem