[SHELL] identifier le fichier le plus recent

jimbo -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

je récupère régulièrement des fichiers sur un FTP, les fichiers sont du type :

nomdufichier-version

je souhaiterai pourvoir faire un script qui téléchargerait la dernière version du fichier.

exemple :

nomdufichier-1.0.0
nomdufichier-1.0.1
nomdufichier-2.0.0

je voudrais pouvoir faire un WGET de la dernière version, mais je ne sais pas comment faire identifier le fichier le plus recent,

merci de votre aide
A voir également:

4 réponses

mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
A froid je ne vois pas de solution simple à part écrire un script (shell par exemple). A mon avis tu vas avoir besoin de grep, sort, uniq.

Une fois la liste des fichiers récupérés dans un fichier (par exemple list_dl.txt), trie-le pour générer un list.txt :

sort -u list_dl.txt > list.txt


Ensuite le but est d'extraire le nom du fichier sans le numéro de version. Soit ce nom ne comporte pas de - (hormis celui qui sépare le nom et la version) et tu peux faire un :

cut -f1 -d'-'


... soit il va falloir te débrouiller avec une expression régulière. Le but est de convertir le fichier list.txt, qui pourrait contenir :

a-1.0.1
a-1.0.2
b-2.0.1
c-3.0.4


en un fichier files.txt :

a
a
b
c


Applique à ce fichier la commande "uniq" pour générer un files2.txt :

uniq files.txt > files2.txt


Ensuite fais une boucle du genre :

for x in `cat files2.txt`; do
  for y in `grep "^$x" list.txt | sort -r`
    echo "Je vais maintenant récupérer $y"
    wget ftp://blabla/$y
    break
  done
done


Il ne reste plus qu'à supprimer les fichiers temporaires... Bon il y a peut-être mieux (une commande magique) mais à froid je n'ai pas d'autres solutions qui me viennent.

Bon sinon ce qui serait pas mal si tu as la main côté serveur, (c'est ce qui est fait dans /lib d'ailleurs), ce serait d'avoir un lien symbolique qui pointe sur la "bonne" version et qui permette de s'affranchir du numéro de version.

À voir aussi mais si tu as la main côté serveur et selon ton besoin, des solutions comme rsync ou svn pourrait peut-être être plus pratique (en supposant que l'on écrase toujours le fichier par sa dernière version).

Bonne chance
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,

La commande "ls" avec le paramètre "-v" trie directement les fichiers en focntion de la version :

       -v     Trier le contenu des répertoires en fonction de la  version  des
              fichiers.  Ceci prend en compte le fait que les noms de fichiers
              utilisent fréquemment des indices ou des numéros de version. Les
              fonctions de tri standards ne fournissent pas en général l'ordre
              attendu car les comparaisons ont lieu caractère  par  caractère.
              Le  tri  de  version  gère  ce problème, et est particulièrement
              utile lorsque l'on parcourt des répertoires  contenant  de  nom-
              breux  indices  ou  numéros de version dans les noms de fichier.
              Par exemple :
                   $ ls -1            $ ls -1v
                   foo.zml-1.gz       foo.zml-1.gz
                   foo.zml-100.gz     foo.zml-12.gz
                   foo.zml-12.gz      foo.zml-25.gz
                   foo.zml-25.gz      foo.zml-100.gz
              Remarquez que les parties numériques commençant  par  des  zéros
              sont considérées comme des décimales :
                   $ ls -1            $ ls -1v
                   abc-1.007.tgz      abc-1.007.tgz
                   abc-1.012b.tgz     abc-1.01a.tgz
                   abc-1.01a.tgz      abc-1.012b.tgz
              (Ceci est une nouveauté des fileutils-4.0).

;-))
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Ah oui c'est mieux qu'un sort ça :-) Ca va éviter de galérer avec des grep ou des sort. Mais bon il reste à récupérer la liste des fichiers qu'il faut finalement récupérer.
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Avec 'ssh' (ssh user@ftp ls -1v) ou via 'lftp' (lftp -e 'ls ; quit' user:pasword@ftp:/chemin)
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Ca je suis d'accord que tu peux exécuter une commande déportée sur ssh ou ftp, mais le ls -1v sort la liste triée de tous les fichiers. Fort bien, mais il reste dans cette liste triée à extraire les bons fichiers. Ou quelque chose m'a échappé dans ce que tu as indiqué.
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Oups j'étais parti que la récupération d'un seul fichier (trié sur sa version) et je pensais (dans ma tête de linotte) qu'avec un tail ou head en sortie (en fonction du besoin) ce serait suffisant...

Attendons que notre ami se manifeste (s'il se manifeste) histoire de ne pas causer dans le vide ;-))
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Oui avec un "tail -n 1" tu t'en sortirais s'il y un fichier (ou si tu es capable de faire une boucle qui va faire un grep sur chaque version). Ça éviterait la boucle "for y" que j'ai écrite dans le message <1>.
0