#1 Le 06/01/2017, à 13:30
- chamblard
[résolu] appeler une fonction dans la commande find -exec fn {} \;
Bonjour,
Je bloque lors de l'écriture de mon script avec la fonction find. Je voudrai savoir si mon utilisation est possible ou non.
Lors d'une recherche find je souhaite utiliser plusieurs commandes sur les résultats grace à -exec.
find . -name fichier -exec 'commande1 {} ; commande 2 {}' \;
ou
find . -name fichier -exec commande1 {} ; commande 2 {} \;
exemple :
touch fichier; find . -name fichier -exec 'echo "{} trouvé"; echo rien' \;
touch fichier; find . -name fichier -exec $(echo "{} trouvé"; echo rien) \;
touch fichier; find . -name fichier -exec `echo "{} trouvé"; echo rien` \;
comme cela ne marche pas, j'ai voulu définir un fonction "fn" en amont dans le script puis l'appeler dans find -exec fn {} \;
mais ca ne marche pas non plus !!!
voici un script :
#!/bin/bash
fn(){
echo '$1 = '"$1"
echo 'la fonction "fn" marche bien'
echo
}
fn coucou
touch fichier0
find . -name fichier0 -exec echo "{} trouvé" \;
find . -name fichier0 -exec fn {} \;
find . -name fichier0 -exec `fn {}` \;
find . -name fichier0 -exec $(fn {}) \;
echo ' la fonction "fn" ne marche pas dans la fonction "find -exec"'
rm -v fichier0
echo fin
(pour tester facilement copier si dessous dans un terminal
mkdir rep_de_test; cd rep_de_test; touch script1; chmod +x script1 ; cat <<'EOF' > script1 #!/bin/bash fn(){ echo '$1 = '"$1" echo 'la fonction "fn" marche bien' echo } fn coucou touch fichier0 find . -name fichier0 -exec echo "{} trouvé" \; find . -name fichier0 -exec fn {} \; find . -name fichier0 -exec `fn {}` \; find . -name fichier0 -exec $(fn {}) \; echo ' la fonction "fn" ne marche pas dans la fonction find -exec' rm -v fichier0 echo fin EOF
puis
./script1
)
Est-ce que c'est possible dans in script de définir une fonction puis de l'utiliser dans la commande find -exec?
La seule solution que j'ai trouvée c'est de créer 2 scripts dont 1 qui contient la fonction
fichier 1 = "fn" :
#!/bin/bash
echo '$1 = '"$1"
echo 'la fonction "fn" marche bien'
echo
fichier 2 = "script2" :
#!/bin/bash
./fn coucou
touch fichier0
find . -name fichier0 -exec echo "{} trouvé" \;
find . -name fichier0 -exec ./fn {} \;
find . -name fichier0 -exec `./fn {}` \;
find . -name fichier0 -exec $(./fn {}) \;
rm -v fichier0
echo fin
pour tester :
touch fn; chmod +x fn ; cat <<'EOF' > fn #!/bin/bash echo '$1 = '"$1" echo 'la fonction "fn" marche bien' echo EOF
ET
touch script2; chmod +x script2 ; cat <<'EOF' > script2 #!/bin/bash ./fn coucou touch fichier0 find . -name fichier0 -exec echo "{} trouvé" \; find . -name fichier0 -exec ./fn {} \; rm -v fichier0 echo fin EOF
puis
./script2
Merci pour votre aide
(( pensez à supprimer "rep_de_test" si vous avez testé mes scripts ))
Dernière modification par chamblard (Le 08/01/2017, à 16:37)
Hors ligne
#2 Le 06/01/2017, à 14:44
- pingouinux
Re : [résolu] appeler une fonction dans la commande find -exec fn {} \;
Bonjour,
Ceci fonctionne :
#!/bin/bash
fn()(
echo '$1 = '"$1"
echo 'la fonction "fn" marche bien'
echo
)
export -f fn
fn coucou
touch fichier0
find . -name fichier0 -exec bash -c "fn {}" \;
rm -v fichier0
echo fin
Hors ligne
#3 Le 06/01/2017, à 14:48
- credenhill
Re : [résolu] appeler une fonction dans la commande find -exec fn {} \;
hello
essayer
find . -name fichier -exec commande1 {} \; -exec commande2 {} \;
# ou
find . -name fichier -exec bash -c "commande1 {}; commande2 {} " \;
Dernière modification par credenhill (Le 06/01/2017, à 14:50)
Hors ligne
#4 Le 08/01/2017, à 16:36
- chamblard
Re : [résolu] appeler une fonction dans la commande find -exec fn {} \;
Salut à vous 2 et merci pour votre aide.
Vous m'avez bien aidé mais je suis pas sur d'avoir tout compris.
Voici le dernier script qui récapitule les tests
#!/bin/bash
fn()(
echo '$1 = '"$1"
echo 'la fonction "fn" marche bien'
echo )
fn test ;
touch fichier0 ;
echo ' Tests credenhill :'
echo ' Test 1 : find . -name fichier -exec commande1 {} \; -exec commande2 {} \;'
echo ' find . -name fichier0 -exec echo -n "commande 1" \; -exec echo " et commande 2 sur {}" \;'
find . -name fichier0 -exec echo -n "commande 1" \; -exec echo " et commande 2 sur {}" \;
echo ' --- Test 1 OK !!'
echo ' Test 1bis avec fn : find . -name fichier -exec fn {} \; -exec commande2 {} \;'
echo ' find . -name fichier0 -exec fn {} \; -exec echo " et commande 2 sur {}" \;'
find . -name fichier0 -exec fn {} \; -exec echo " et commande 2 sur {}" \;
echo ' --- Test 1bis NOK !!'
echo ' Test 2 : find . -name fichier -exec bash -c "commande1 {} ; commande2 {} " \;'
echo ' find . -name fichier0 -exec bash -c "echo -n commande 1 ; echo \" et commande 2 sur {}\"" \;'
echo "ou : find . -name fichier0 -exec bash -c 'echo -n commande 1 ; echo " et commande 2 sur {}"' \;"
find . -name fichier0 -exec bash -c "echo -n commande 1 ; echo \" et commande 2 sur {}\"" \;
echo ' --- Test 2 OK '
echo ' Test 2bis avec fn : find . -name fichier -exec bash -c "fn {} ; commande2 {} " \;'
echo ' find . -name fichier0 -exec bash -c "fn {} ; echo et commande 2 sur {}" \;'
find . -name fichier0 -exec bash -c "fn {} ; echo et commande 2 sur {}" \;
echo ' --- Test 2bis NOK '
echo ' Tests pingouinux :'
echo "export -f fn;"
export -f fn;
echo ' Test 3 : find . -name fichier0 -exec bash -c "fn {}" \;'
find . -name fichier0 -exec bash -c "fn {}" \;
echo ' --- Test 3 OK !!'
echo ' Test 3bis : find . -name fichier0 -exec fn {} \;'
find . -name fichier0 -exec fn {} \;
echo ' --- Test 3bis NOK !!'
rm -v fichier0 ;
echo fin
Conclusion :
Pour chainer 2 commande dans find ... -exec il faut utiliser une des syntaxes suivantes :
répétition de "-exec" pour chaque commande
find . -name fichier -exec commande1 {} \; -exec commande2 {} \;
ou
appel avec bash -c (pourquoi? ) puis "cmd1 ; cmd2 " (ou 'cmd1 ; cmd2 ""')
find . -name fichier -exec bash -c "commande1 {} ; commande2 {} " \;
Pour utiliser une fonction créée plus tot il faut avant exporter la fonction (pourquoi? ) :
export -f fonction
find . -name fichier0 -exec bash -c "fonction {}" \;
Donc OK mon problème est résolu mais j'ai pas compris :
pourquoi il faut faire appel à la fonction bash -c ?
pourquoi il faut exporter la fonction pour que cela fonctionne dans find -exec alors qu'il n'y a pas besoin de le faire pour que ça fonctionne dans le reste du script ?
Si vous avez une explication c'est avec plaisir
Hors ligne