Télécharger un fichier avec nom qui change de temps en temps avec la commande wget ou curl

Bonjour à tous,

Je ne sais pas si ce sujet est dans la bonne section, vous m’excuserez dans le cas contraire. Enfin j’éspère :yum:

Je voudrais trouver un moyen pour télécharger un fichier à partir d’un ftp ou http avec la commande wget ou curl peut être. Cette commande serait scriptée afin d’automatiser cette tâche bien entendu.

Jusque là ça ne pose pas vraiment de soucis; seulement ce fichier change de version de temps en temps .
Il peut donc s’appeler fichier_v5.0 et puis plus tard fichier_v5.1… etc…

**Je n’ai bien sûr pas d’accès côté serveur pour changer le nom de ce fichier.

**Je pensais à la commande wget ou curl avec un pipe mais là je n’arrive pas à trouver de solution.

ex:
curl ftp://serveur.fr/ | grep fichier

Je m’en remet donc à vous. Avez une petite idée ?

Jo

Il faut dans ton cas un traitement côté serveur pour trouver le nom du fichier qui peut varier, avec curl ou wget en direct je ne vois pas comment faire.
Je te propose autre chose, tu montes ta ressource FTP dans un dossier de ton PC et tu recherches ton fichier comme s’il était en local !
j’utilise beaucoup ce genre de montage avec curlftpfs je te conseille de l’utiliser avec autofs, comme indiqué ici : https://wiki.archlinux.org/index.php/autofs

voici un petit script bash

(
 echo "
      open ftp.serveur.fr
      user LOGIN $1
      cd "/tondossier/"
      ls -t 
      close
    "
) | ftp -i -n | grep -E ".*toto.*"

va récupérer la liste des fichiers « *toto* », le plus récent est au début , ajouter un | head -1 et utiliser awk à la place de grep

ps: pas sur que le ls -t fonctionne bien sur tout serveur ftp (a tester)

EDIT: @seb-ksl ok, changé. mot de passe passé en paramètre du script et si vide alors demandé automatiquement en interactif

Je sais pas pourquoi, j’ai jamais été grand fan des scripts avec le mot de passe en clair dedans :confused:.

Édit : @papajoker Merci :slight_smile:.

Et bien merci pour toutes vos réponses, c’est vraiment sympa !

Je vais sans doute opter pour le montage local, ce sera sans doute un peu moins compliquer.
Enfin je l’espère :slight_smile:

J’utilise déjà autofs pour du partage cifs donc avec un peu de travail je devrais y arriver.

Sachant qu’en plus il s’agit d’un ftp public donc pas de soucis avec des credentials particuliers.

C’est ça qui est bien avec les distribs de linux, c’est qu’il y a toujours un moyen de moyenner :smile:

Merci encore !

Salutations,

Je reviens faire un petit retour d’expérience :

Du coup j’ai réussi à créer mon montage ftp avec curlftps et autofs comme conseillé par @debianhadic

ensuite en ce qui concerne la copie du fichier avec un nom qui change je me suis inspiré de ce site :

stackoverflow.com

Ce qui donne en ce qui me concerne la commande suivante :

find -name '*adwcleaner*.exe' | xargs cp -t  /media/5eb11d90-c575-475f-9d1b-922637998688/_Logiciels_à_installer/Antispy\ désinfection/ROGUEKILLER-Adwcleaner

J’ai aussi rajouté cette petite ligne à mon script qui permet de renommer le fichier adwcleaner_v…exe en Adwcleaner.exe (tout court) en faisant :

mv $(find -name "*AAA*") path_B

dans mon exemple :

mv $(find -name "*adwcleaner*.exe") Adwcleaner.exe

Il s’agit en fait de télécharger automatiquement sur un serveur la dernière version de quelques logiciels de nettoyage pour Windows, dont adwcleaner. C’est pour le boulot (Je sais c’est triste Windows ):cold_sweat:

ça à l’air de fonctionné, ça reste compréhensible pour moi donc tout va bien :smile:

Merci à vous pour le coup de pouce !

Je change de rubrique pour pouvoir indiquer que c’est résolu !
Merci du retour.

Bonjour,
Je me suis inspiré de votre sujet pour trouver une solution à mon problème qui est similaire au votre. Alors au lieu d’ouvrir un nouveau topic je la poste ici puisque ça répond à la question et je la trouve plus simple.

Contexte :
Je fais des scripts bash pour installer des logiciels/paquets (ça m’amuse :stuck_out_tongue: )
et j’ai fais cette méthode, à chaque fois que j’ai installé un paquet qui n’est pas dans un dépôt, pour trouver la dernière version du paquet. Mon problème était qu’il y a à chaque fois au moins 3 versions sur la page web, par exemple comme ceci :
https://download.noalyss.eu/noalyss-package/new/

Pour pouvoir faire ça je voulais utiliser que des outils qui se trouve sur la majorité des systèmes Linux pour un portage facile. Certains de ces outils ne sont pas à présenter comme ‹ wget ›, ‹ awk ›, voire même ‹ tr ›. Mais j’en ai découvert un lors de ma recherche , ‹ w3m › c’est un web browser pour le terminal (w3m packaging badges - Repology). Et donc je me sers de ‹ w3m › exactement comme on se sert de ‹ cat › pour un fichier.

Solution :

for version in $(w3m https://URL/DU/SITE/WEB/ | tr -s ' ' | awk -F " " '$3 ~ /.[EXTENSION_DU_FICHIER]$/ {print $3}'); do
    if [[ -z ${last_version} ]]; then
        last_version=${version};
    else
        if [[ ${version} > ${last_version} ]]; then last_version=${version}; fi
    fi
done
last_version="${last_version%.[EXTENSION_DU_FICHIER]}" #Supprime l’extension dans le nom du fichier

echo "La dernière version du paquet est : ${last_version}"
wget https://URL/DU/SITE/WEB/"${last_version}".sha256sum
wget https://URL/DU/SITE/WEB/"${last_version}".tar.gz

Donc dans mon exemple ça donne :

#Je mets les informations de la page web qui correspond à tous
#les fichiers dans la variable version_list pour que le code soit plus clair.

version_list=$(w3m https://download.noalyss.eu/noalyss-package/new/ | tr -s ' ' | awk -F " " '$3 ~ /.tar.gz$/ {print $3}') 
for version in ${version_list}; do
    if [[ -z ${last_version} ]]; then
        last_version=${version};
    else
        if [[ ${version} > ${last_version} ]]; then last_version=${version}; fi
    fi
done
last_version="${last_version%.tar.gz}"

echo "La dernière version de Noalyss est : ${last_version}"
wget https://download.noalyss.eu/noalyss-package/new/"${last_version}".sha256sum
wget https://download.noalyss.eu/noalyss-package/new/"${last_version}".tar.gz

Bien entendu certaines choses sont à modifier en fonction de chacun, hormis l’URL, il y aura aussi ce qu’il faut mettre dans le awk, tout dépend comment est fait le nom du paquet et les colonnes de la page web.

Salut,

je parse parfois des pages web pour y récupérer également des liens de fichiers à télécharger, j’utilise wget pour les récupérer, mais w3m permet apparemment de rendre le html en plain text, ce qui peut alléger les opérations. Je n’y avais jamais pensé, merci !

Pour rendre ton script plus robuste, tu pourrais utiliser une variable version_list de type tableau. Là c’est un scalaire (une chaîne de caractères), ça fonctionne tout de même dans ta boucle for car la variable contient des caractères qui sont des séparateurs de champs pour bash, mais ça serait plus propre avec une variable tableau version_list que tu pourras parcourir avec ${version_list[@]}.
Et suite aux recommandations de l’outil shellcheck, j’utilise mapfile pour générer ce genre de variables.
Si tu aimes faire des scripts shell, je te conseille vivement shellcheck (tu peux même l’utiliser directement dans vim, avec les plugins nécessaires), en plus d’identifier facilement quelques erreurs syntaxiques, ça permet d’apprendre quelques astuces et bonnes pratiques.

1 J'aime

Bonjour Sputnik93 !

Content que cela te soit utile :slight_smile:

Je n’ai pas encore appris à me servir de variable « tableau », mais ça ne serait tardé parce que j’imagine que de les traiter ligne par ligne peut peut-être permettre d’éviter les problèmes avec un élément de la liste qui contient des espaces par exemple, si je comprends bien l’idée, et certainement entre d’autres choses… En parlant de shellcheck j’ai eu justement cette erreur (ShellCheck: SC2013 – To read lines rather than words, pipe/redirect to a `while read` loop.) mais étant donné qu’il ne met pas en avant le problème que tu décris je ne l’avais pas vu sous cet angle. alors merci beaucoup, je vais me pencher et tester les variables tableau pour essayer d’améliorer mes scripts ! :star_struck: