Condition avec "find" dans un script

Bonjour,

je veux ecrire un script qui va rechercher un fichier dans un repertoire et s'il le trouve éxecuter des actions au cas contraire passer a un autre repertoire ainsi de suite

exemple

cd  rep1

find . -type f -name "R11000006*" -print | while read obj
do

cp  R11000006* /repdir1

./script.sh

rm  R110*

done

cd rep2

   find . -type f -name "R11000006*" -print | while read obj
do

cp R11000006* /repdir2

./script.sh

rm  R110*

done



Mais ça ne fonctionne pas, je suis sous solaris10.

merci d'avance pour vos proposition

5 réponses

  1. Si tu disposes d'une liste de fichiers dans lesquels chercher:

    while [ $1 ]; do
        find . -type f -name "R11000006*" | while read l; do echo "$l"; done
        shift
    done


    Tu lances ce code dans avec en paramètres les dossier à scanner.
    "find" affiche les resultats qui seront lus dans la boucle "while read l" et ou les actions situés après le "do" seront appliqués.
    "shift" décale l'ordre des variables ($2 -> $1, $3->$2,...).

    Mais le plus simple serait d'utiliser l'option "-exec" de "find", de cette façon:
    find . -type f -name "R11000006*" -exec action {} \;
    ou action est une commande ou suite de commandes avec leurs paramètres. Ça donnerais à peu près ça:

    while [ $1 ]; do
        find . -type f -name "R11000006*" -exec echo "Found" {} \;
        shift
    done


    Bien entendu en remplaçant le echo par les commandes à exécuter dans on cas.
    0
    1. salut,

      s'il faut prendre en compte des arguments passés au script
      un boucle for serait plus légère, bien qu'inutile : 'find' accepte plusieurs noms de dossiers de recherche.
      find "$@" dossiers_en_plusDzarguments -iname "nomFichier" -exec commande {} \;
      0
      1. @qqchquicommenceparQ: merci pour l'astuce du find qui accepte plusieurs dossiers de recherche, je ne savais pas :)
        0
        1. bonjour

          merci les gars

          Mais le code ne fonctionne pas bien car même quand je supprime le fichier R11000006* dans le répertoire il m'envoie ok ci dessous le code
          nom du script :FIND.sh

          while [ $1 ]; do
              find . -type f -name "R11000006*" -exec echo "OK" {} \;
              shift
          done
          


          exécution du script :

          ./FIND.sh  dir1
          


          mon souci est que j' ai un script qui traite le fichier R11000006* ce fichier a le même nom dans 59 répertoires différents mais son contenu est différent.
          le problème que j'ai est quand mon script tourne et qu'il tombe sur un répertoire où le fichier n'existe pas le script se bloque, du coup j ai plein de repertoire qui ne sont plus traités.

          Donc ce je voulait avec find est de tester d'abord le répertoire dir1 pour voir si le fichier R11000006* existe alors copie le dans un dir2 et traite le au cas contraire passe au répertoire dirn suivant.

          je pense que j'ai été assez clair dans mais explication.

          je suis disponible pour des info complémentaires

          merci d'avance
          0
          1. Premièrement, il faut remplacer le "." du find par le dossier dans lequel chercher.
            "." correspond au dossier courant (donc si tu es dans "/home/", "." est "/home/")

            Ensuite, pour le shell (bash, tcsh, zsh,...), le caractère * correspond a tout (c'est un joker). Donc si tu as, admettons, 3 fichiers: R11000006, R11000006-2, R11000006-3, les 3 fichiers seront trouvés car * peut correspondre à rien, a "-2" et à "-3". Si ton fichier se nomme "R11000006*" et que l'étoile fait partie du nom, tente ce nom de à la place: "R11000006\*" Le caractère \ permet de ne pas interpreter le * comme un joker.

            J'ai testé chez moi. Voilà mon arborescence:

            master[mbp.local]@~/test: ls *
            a.sh
            
            d1:
            R11000006*
            
            d2:
            R11000006*
            
            d3:
            R11000006*
            
            d4:
            
            d5:
            R11000006*
            
            d6:
            R11000006*
            master[mbp.local]@~/test:


            Donc le fichier "R11000006*" est bien présent dans tous les dossiers, sauf de d4.
            Voici le script:

            while [ $1 ]; do
                find $1 -type f -name "R11000006\*" -exec echo "OK" {} \;
                shift
            done


            Et voici la sortie après execution du script:

            master[mbp.local]@~/test: ./a.sh d*
            OK d1/R11000006*
            OK d2/R11000006*
            OK d3/R11000006*
            OK d5/R11000006*
            OK d6/R11000006*
            master[mbp.local]@~/test:


            On voit bien que le fichier "R11000006*" a été trouvé dans les repertoires d1, d2, d3, d5 et d6, mais pas dans d4.
            0