If avec la commande find (modif de fichiers)

Résolu
ludivine -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour

Je n'arrive pas à trouver sur le net et je débute en script.

J'aimerais faire un script qui me permet d'examiner un répertoire.
  • si un des fichiers du répertoire a bougé dans les 10 minutes (modification d'un ficher ou ajout) alors j'affiche
    no new
    ;
  • sinon j'affiche
    new
    .


J'essaye avec une boucle :

#!/bin/bash

if find  /tmp/test/  -mmin -10 -eq 'False'; then echo "no new"
else; echo "new"
fi


Mais le
-eq 'False'
ne fonctionne pas : je ne trouve pas l'équivalent pour la commande
find
, ou alors je me trompe de commande.

Pouvez- vous m'aider s'il vous plaît ?

Merci

5 réponses

  1. ludivine
     
    Je viens de modifier

    !/bin/bash
    
    if find /tmp/test/ -mmin -10  | xargs ls -l
    then
       echo 'Found something'
    else
       echo 'Found nothing'
    fi


    ... mais j'ai un soucis : il me prend en compte les répertoires du dessus. Moi, je ne veux que le répertoire
    test
    qui est dans
    /tmp/
    .
    0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Bonjour,

    Je n'ai pas très bien compris quel était ton problème dans la deuxième version.

    Pour commencer, je ne vois pas l'intérêt de
    | xargs ls -l
    à ce stade, donc je vais l'ignorer pour le moment.

    Comme tu le vois ci-dessous,
    /tmp/test1
    n'est pas listé, mais
    /tmp/test
    et
    /tmp/test/test2
    sont bien listés.

    (mando@silk) (~) $ mkdir /tmp/test
    (mando@silk) (~) $ find /tmp/test/ -mmin -10
    /tmp/test/
    (mando@silk) (~) $ touch /tmp/test1
    (mando@silk) (~) $ find /tmp/test/ -mmin -10
    /tmp/test/
    (mando@silk) (~) $ touch /tmp/test/test2
    (mando@silk) (~) $ find /tmp/test/ -mmin -10
    /tmp/test/
    /tmp/test/test2


    Bonne chance
    0
  3. ludivine
     
    Merci pour ton aide .

    J'ai fait une autre modification en suivant des forums.

    #!/bin/bash
    
    if [[ -n $(find /tmp/test/ -mmin -5) ]] 
    then
       echo 'Found something'
    else
       echo 'Found nothing'
    fi


    Cette version fonctionne même si je ne comprends pas trop le
    -n
    au début ?

    Je suis en train d'essayer de la modifier pour intégrer
    ssh
    à mon
    if
    car le dossier à checker se trouve sur un autre PC. Pour le moment je cherche encore
    0
    1. ludivine
       
      merci bcp
      0
  4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Bonjour Ludivine,

    Cette version fonctionne même si je ne comprends pas trop le -n au début ?

    Cette page recense les différents opérateurs que l'on peut utiliser dans un test en bash. Comme tu le verras, l'opérateur
    -n
    vérifie si la chaîne testée (en l'occurrence, le résultat de ta commande
    find
    ) n'est pas la chaîne vide. C'est donc un peu plus rigoureux même si sans
    -n
    , le code est tout aussi correct.

    Je suis en train d'essayer de la modifier pour intégrer un ssh à mon if car le dossier à checker se trouve sur un autre pc.

    Tu peux lancer une commande shell via
    ssh
    simplement en la précédent de la commande
    ssh login@machine
    , par exemple
    ssh mando@localhost ls /
    . Note qu'il peut être intéressant de préparer une clé ssh qui permettra d'éviter d'avoir à taper ton mot de passe à chaque fois que tu utilises
    ssh
    .

    Dans ton cas ça pourrait ressembler à ça :

    #!/bin/bash
    
    user="ludivine"
    host="11.22.33.44"
    if [[ -n $(ssh "$user"@"$host" find /tmp/test/ -mmin -5) ]] 
    then
       echo 'Found something'
    else
       echo 'Found nothing'
    fi


    Bonne chance
    0
    1. ludivine
       
      Bonjour mamiemando

      Merci pour ton aide et ta precision sur le
      -n
      .

      je viens de faire une modification mais je ne sait pas trop comment concaténer ma commande pour qu'elle fonctionne.
      Actuellement j'ai (error et logger sont des fonctions )

      if ${ssh} ${SSH_USER}@${IP_PC_INDUS} -p ${SSH_PORT} "find ${USERREP} -mmin -1"
      then
        logger "on continue"
      else
         error "pas de modifications"
      fi


      Mais dans mon cas là, je perds l'option
      -n
      car je ne sais pas comment concaténer correctement le tout [].
      0
      1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940 > ludivine
         
        Voici ce que tu peux faire :

        #!/bin/sh
        ssh_login="mando"
        ssh_host="localhost"
        ssh_port=22
        ssh_prefix="ssh $ssh_login@$ssh_host -p $ssh_port"
        user_dir="/tmp/test"
        
        if [[ -n $($ssh_prefix find "$user_dir" -mmin -1) ]]
        then
          echo "on continue"
        else
          echo "pas de modifications"
        fi


        Exemple :

        (mando@silk) (~) $ bash toto.sh 
        mando@localhost's password:
        find: ‘/tmp/test’: Aucun fichier ou dossier de ce type
        pas de modifications
        (mando@silk) (~) $ touch /tmp/test
        (mando@silk) (~) $ bash toto.sh
        mando@localhost's password:
        on continue


        Quelques recommandations
        • Avec l'opérateur
          $
          tu peux omettre quand il n'y a pas d'ambiguités les accolades. J'ai donné la syntaxe avec car c'est la plus rigoureuse et ça permet de faire des trucs assez violents, genre crafter des noms de variables à partir des valeurs d'autres variables, mais ici on n'en n'a pas besoin.
        • Dans le cas général, une valeur de variable peut contenir des espaces, ce qui peut complètement casser ton programme (voire être un trou de sécurité) donc il faut autant que possible encadrer les valeurs de variables avec des guillemets ou des apostrophes, en particulier pour les noms de fichiers qui peuvent en contenir (e.g.
          $user_dir
          ). Attention cependant, car tu ne peux/dois pas le faire partout (par exemple, si le fait pour
          $ssh_port
          ou
          $ssh_host
          ,
          ssh
          sera perdu).
        • Je te recommande pour les noms de dossiers d'utiliser le suffixe
          _dir
          , c'est ce qui est communément utilisé.
        • Au sujet des noms de variables, tu peux utiliser des majuscules ou des minuscules. Personnellement j'ai tendance à utiliser des minuscules pour les variables internes et des majuscules pour les variables externes (construites à partir des arguments passés au script shell, e.g
          $1
          ,
          $2
          etc.). Dans d'autre langages, on réserve les noms de variables majuscules aux constantes globales.
        • Toujours à ce sujet, je t'invite à les nommer de manière consistante, claire, et en "prévision du futur" est toujours une bonne idée. Par exemple, le préfixe
          ssh_
          permet de trouver avec l'auto-complétion toutes les variables liées à ssh, améliore la lisibilité, et permet d'éviter un renommage si ton script implique par la suite un autre service réseau.


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

    Posez votre question
  6. ludivine
     
    Un énorme merci pour ce message clair je viens d'apprendre plein de nouvelles choses.
    J'ai encore beaucoup beaucoup de choses à apprendre sur le scripting shell.

    Encore merci pour ton aide précieuse.

    Je te souhaite une bonne journée
    0
    1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
       
      Merci pour ton retour, bonne découverte du shell et bonne journée :-)
      0