Condition avec "find" dans un script
GHISLINO
Messages postés
214
Date d'inscription
Statut
Membre
Dernière intervention
-
Korna -
Korna -
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
Mais ça ne fonctionne pas, je suis sous solaris10.
merci d'avance pour vos proposition
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
A voir également:
- Condition avec "find" dans un script
- Excel cellule couleur si condition texte - Guide
- Script vidéo youtube - Guide
- Find and mount - Télécharger - Récupération de données
- Mas script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
5 réponses
Si tu disposes d'une liste de fichiers dans lesquels chercher:
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:
Bien entendu en remplaçant le echo par les commandes à exécuter dans on cas.
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.
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.
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 {} \;
@qqchquicommenceparQ: merci pour l'astuce du find qui accepte plusieurs dossiers de recherche, je ne savais pas :)
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
exécution du script :
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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:
Donc le fichier "R11000006*" est bien présent dans tous les dossiers, sauf de d4.
Voici le script:
Et voici la sortie après execution du script:
On voit bien que le fichier "R11000006*" a été trouvé dans les repertoires d1, d2, d3, d5 et d6, mais pas dans d4.
"." 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.