Bash test [[ expression regulière

Résolu
sbouli Messages postés 208 Statut Membre -  
sbouli Messages postés 208 Statut Membre -
Bonjour,

J'ai une variable $fich_name_check contenant un nom de fichier, Je voudrais déterminé si ce nom de fichier contient .gz.
je dis bien contient à tout endroit de la chaine, pas seulement comme extension ...

exemple : mail.log.1.gz.2007-02-39

if $fich_name_check =~ .gz. # ici il faut la bonne expression régulière ....
then
echo "oui le nom de fichier contient bien .gz."
else
echo "non il ne le contient pas"
fi

Je ne sais pas combien de termes avec des . peuvent séparer le .gz. ni le suivre ....

Au secours ... o:)

Stéphane

6 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Essaie comme ça :
    echo "$fich_name_check" | grep -q '\.gz\.'
    if [ "$?" = "0" ]
    then
    echo "oui le nom de fichier contient bien .gz."
    else
    echo "non il ne le contient pas"
    fi 
    ;-))
    2
    1. sbouli Messages postés 208 Statut Membre 2
       
      Merci
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > sbouli Messages postés 208 Statut Membre
         
        De rien ;-))
        0
  2. sbouli Messages postés 208 Statut Membre 2
     
    je rebondis sur ce vieux post car je pensais faire un peu la même chose avec une liste de fichier exclus sous la forme :

    egrep -q -e "${IGNORE_FILES_ALERTE}" <<<${fich##*/}


    avec par exemple

    IGNORE_FILES_ALERTE="access component toto.log"

    et donc dans une boucle la valeur de ${fich} qui tourne sur les fichiers du répertoire :

    for fich in 'ls -1 ${LOGS_PATH}/*.log 2>/dev/null'
    do
        egrep -q -e "${IGNORE_FILES_ALERTE}" <<<${fich##*/}
        retval=$?
        if [[ ${retval} = 0 ]]
        then
                echo "je ne traite pas ce fichier basename ${fich}, il fait parti des exceptions aux alertes"
        else
                 echo "envoi d'une alerte pour ${fich}"
        fi
    done
    


    et ça ne fonctionne pas ....

    Stéphane
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      for fich in ${LOGS_PATH}/*.log ; do ...

      ;-))
      0
    2. sbouli Messages postés 208 Statut Membre 2
       
      merci mais c'est pas ça qui marchait pas, quoi que je préfère ta méthode, c'est le egrep qui marche pas ...

      je ne parvient pas à chercher le nom de fichier parmis une liste de nom de fichiers ....


      Stéphane
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      merci mais c'est pas ça qui marchait pas,
      Ben si, si tu avais des espaces dans tes noms de fichiers ça ne risquait pas de marcher ;-\

      je ne parvient pas à chercher le nom de fichier parmis une liste de nom de fichiers ....
      C'est quoi ta liste ? ${IGNORE_FILES_ALERTE} ?
      0
  3. Utilisateur anonyme
     
    en ce qui concerne le problème original, une regex n'est pas indispensable (grep non plus)
    if [[ $fich_name_check == *.gz ]]; then
    etc

    ICI, que peut valoir ${fic##*/} est exactement 'access component toto.log', ou autrechose
    if [ "${fic##*/}" = "$IGNORE_FILES_ALERTE" ]
    si il y a besoin de plus, précise le.
    0
  4. sbouli Messages postés 208 Statut Membre 2
     
    effectivement il semble que je me sois expliqué comme une chèvre (pov bête) ...

    Le but : avoir une liste de nom de fichier à exclure :

    IGNORE_FILES_ALERTE="access component toto.log"

    donc je ne dois pas traiter le fichier s'il s'appel access ou component ou toto.log

    je boucle donc sur mon rep (oui je sais dans le code je sélectionne déjà que les .log ...) et si le nom de fichier est présent dans la liste ben je passe au suivant ...

    Stéphane
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Alors fait le contraire :

       egrep -q -e "${fich##*/}" <<<${IGNORE_FILES_ALERTE}

      ;-))
      0
    2. sbouli Messages postés 208 Statut Membre 2
       
      effectivement, ça tourne ...

      et si je voulais corser un peu la chose ? (je viens de tilter) :

      et excluse les fichiers qui contiennent le mot donc par exemple ne pas traiter :

      access_nom_site.log

      ? possible ?

      Stéphane
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    IGNORE_FILES_ALERTE="access component toto.log" 
    for f in ./*; do 
       if [[ ! ${f##*/} =~ ${IGNORE_FILES_ALERTE// /|} ]]; then echo $f; fi 
    done
    ça devrait marcher sous réserve de ne pas utiliser sh, mais bash, ou ksh
    en bash
    shopt -s extglob 
    for f in ./*; do 
       if [[ ! ${f##*/} == +(${IGNORE_FILES_ALERTE// /|}) ]]; then echo $f; fi 
    done
    0
    1. sbouli Messages postés 208 Statut Membre 2
       
      c'est moi qui définis la liste donc je peux directement la séparer par | au lieu d'espace ....

      mais ta solution peut-elle être modifiée pour prendre en compte soit le nom complet du fichier soit 1 mot présent dans le nom de fichier ? (ex: access présent dans access_log_monsite.log)

      Stéphane
      0
  7. sbouli Messages postés 208 Statut Membre 2
     
    Bonjour,

    Je me permet de relancer le sujet, la version :
     egrep -q -e "${fich##*/}" <<<${IGNORE_FILES_ALERTE}
    


    fonctionne parfaitement, mais depuis j'ai découvert qu'il fallait que je détecte aussi des portions de nom de fichier.

    Par exemple si la liste IGNORE_FILES_ALERTE vaut = access toto.log titi.php

    il faut que je détecte les fichiers nommés : access_nom_bidon_de_site aussi comme contenant le mot clef access ...

    et franchement là je vois pas ....

    Merci pour votre aide.
    PS : je ne sais pas si la question à déjà été abordé mais il va bien JIPICY ? (ou il a changé de pseudo ?)
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Re-

      Il faut à nouveau changer la façon de "greper" ;-\

      for fic in ${LOGS_PATH}/*.log 
      do 
      if test $(egrep "${IGNORE_FILES_ALERTE// /|}" <<<${fic})
      then 
      echo OK ${fic}
      fi
      done
      0
    2. sbouli Messages postés 208 Statut Membre 2
       
      nickel merci !
      0