IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

find + regexp + recup uniquement dernière occurence


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut find + regexp + recup uniquement dernière occurence
    Bonjour

    J'ai une liste de fichiers historisés sous la forme <nomfichier>-<aaaaMMjj-hhmm>.gz

    donc par exemple :

    titi-20110220_1400.gz
    toto-20110110_0900.gz
    titi-20110110_1000.gz
    toto-20110220_0700.gz


    Je veux pour chaque fichier (toto et titi) ne récupéré que le plus récents
    donc :
    toto-20110220_0700.gz
    titi-20110220_1400.gz


    car sinon je me retrouverai avec une liste qui pourrait en théorie atteindre pas loin de 1 million de fichiers... (en pratique ca tournerai plutôt aux alentour de 200 000 fichiers)

    mon but est d'avoir cette liste de fichiers (avec chemin depuis le dossier où le script se trouve) dans un tableau obligatoirement trié alphabétiquement

    donc pour le moment j'utilise find * | sort qui me retourne la liste des fichiers triée. Mon problème est de réussir à élaguer cette liste, j'ai vu que le find est très puissant, sauf que n'arrive pas à voir comment faire pour lui dire de ne prendre que la derniere historisation de chaque fichier...

    je connais la liste des fichiers (toto, titi) mais je ne veux pas avoir à faire une boucle pour recuperer chaque dernière occurence, car après l'algo va faire une boucle (c'est la raison pour laquelle je veux élaguer la liste avant de faire la boucle), l'algo n'ayant besoin que de la derniere historisation du fichier

    j'espère avoir été assez clair, au besoin demandez des précisions


    merci.
    Dernière modification par Invité ; 17/03/2011 à 12h20.

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /chemin/ -type f -name "*t[io]t[io]*" -mtime -90 |sort <options_selection> | tail -20
    limite la réponse au 20 derniers résultats obtenu, le reste n'est purement et simplement pas affiché.

  3. #3
    Invité
    Invité(e)
    Par défaut
    merci pour ton aide, mais ça ne peux pas marcher dans mon cas

    déjà 1 : les fichiers je ne sais pas (quand j'écris le script) comment il s'appelleront... donc là j'ai donné titi et toto pour exemple, mais ca pourrait être apache-error-20110317_1206.gz

    ensuite tu met que le fichier a été modifier au cours des 90 derniers jours n'est ce pas ?

    donc déjà ce cas ne peux pas arriver, j'ai une purge qui est faite au maximum tous les 60jours ^^ (heureusement car vu le nombre de fichiers...) et ensuite là je ne veux pas les fichiers depuis n jours, mais pour chaque fichier de log ne récupéré sa dernière version historisée (cf exemple dans premier post).Donc je ne comprend pas non plus pourquoi tu fait un tail -20...

    plus précisément, j'ai dans mon dossier /tr_dac/ les logs "bruts" (récupéré depuis plusieurs dizaines de serveurs/applications)
    dans /tr_dah/ j'ai les version historisés (l'historisation se fait à plusieurs heures de la journée et/ou plusieurs jour de la semaine/mois, les serveurs/applis ont chacun leur configuration)
    mon but, est quand de vérifier si les log dans /tr_dac/ doivent être historisés ou non,
    pour le moment le script parcours la liste des fichiers de log brut (tr_dac) et fait un ls avec regex + tail -1 pour chaque fichier puis compare les date de derniere modif (entre le log brut et la derniere version historisée). le problème c'est que à chaque boucle ca fait une lecture disque... qui fait que que le processus prend énormément de temps, mon but est de passer par des tableaux, et donc de faire la lecture disque en un seul coup et non pas au coup par coup...

  4. #4
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    J'avais pas compris le besoin

    pourquoi pas puisque tu horodates les fichier afficher tous les deniers fichiers par type?
    avec une boucle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for i in TYPE1 TYPE2 TYPE3 ...... ; do ls -lrth ${i} | tail -1 ; done
    la tu garantis d'avoir que le dernier de chaque type quelque soit sa date (même si il est pas horodaté dans son nom ça marchera en prime).

  5. #5
    Invité
    Invité(e)
    Par défaut
    pas de problème, c'est pas facile à expliquer mon cas

    non, ca va faire 10 000 ls comme c'est le cas aujourd'hui, et c'est ca que je veux changer

    et pour le FOR IN... comment je remplis les valeurs ? je ne les connais pas (et pi il peu y'en avoir plus de 10k ...)

  6. #6
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    non ça va afficher que "le dernier ls" de chaque

    find aussi fait ça en réalité, dans son code, et tri les données en sortie en fonction des options..

    la lecture de TOUS les fichiers par le programme que tu va lancer va forcément être faite.

    quel est le véritable rythme de création des fichiers ?

    si c'est moins d'une heure, il est préférable de changer de méthode et surtout de structure,



    -------------

    AMHA la méthode est mauvaise de base, il faut :

    tu fais des répertoires par dates, qui contiennent des répertoires par heures,
    et un répertoire unique pour les 30 jours courants.

    que tu génères tes noms de fichiers par numérotation et pas par nom, ce qui résoud le problème du nom de fichier inconnu en le rendant prévisible et calculable.

    quand au problème de performance à la lecture d'une masse de fichier, gace à la découpe en répertoires :
    un script ou un crontab qui fait le rangement et du coup le temps d'analyse de la commande find sur les fichiers que des 30 derniers jours dans cette exemple et en cas d'echec, de chercher uniquement dans les 30 autres jours..
    ainsi tu divises ton temps de réponse par 2 dans 50% des cas, à savoir le cas ou le fichier date de moins de 30 jours..

    tu peux aussi aussi découper en 8 semaine
    temps / 8 dans 1/8 des cas
    temps / 2 dans 1/2 des cas
    temps == dans 1/8 des cas de ce que tu as aujourd'hui.

    ---------------------

    si c'est des fichiers qui se renouvellent : la méthode c'est le versionning

    ---------------------

    si c'est des datas, fait une recherche sur le contenu pas sur le contenant

    ---------------------




Discussions similaires

  1. Réponses: 2
    Dernier message: 14/04/2009, 16h01
  2. [RegEx] Remplacer dernière occurence d'une chaine par une autre
    Par webjoujou dans le forum Langage
    Réponses: 3
    Dernier message: 12/11/2008, 17h58
  3. Réponses: 32
    Dernier message: 08/03/2008, 03h07
  4. Dernière occurence de contrat
    Par leycho dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/11/2007, 16h30
  5. regexp - Recup d'un parametre dans un .ini
    Par koktel_dfr dans le forum Langage
    Réponses: 8
    Dernier message: 26/06/2007, 10h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo