Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/01/2017, à 14: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

smile )

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 wink ))

Dernière modification par chamblard (Le 08/01/2017, à 17:37)

Hors ligne

#2 Le 06/01/2017, à 15: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, à 15: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, à 15:50)

Hors ligne

#4 Le 08/01/2017, à 17: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? roll) 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? roll) :

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 smile

Hors ligne