Je pense qu'une fois que vous avez utilisé -or
, alors vous devez le garder cohérent afin d'éviter un ordre ambigu des opérations logiques lorsque vous avez plusieurs conditions connectées à l'aide du OU logique.
Il semble que le -exec
la partie est regroupée avec la seconde -name "*.h"
.
Donc, pour que cela fonctionne correctement, vous devez ajouter les crochets comme ci-dessous :
find . '(' -name '*.cpp' -o -name '*.h' ')' -exec echo {} ';'
Vous pouvez également combiner quelques extensions en une seule en utilisant -regex
:
find . ! -regex ".*\.\(cpp\|h\)" -exec echo {} \;
Ni. C'est la syntaxe des options qui est "fausse". find
évalue séquentiellement. Par conséquent, il évalue la première expression (-name "*.cpp"
) rencontre alors un -o
drapeau. Si la première expression est vraie, find
ne continuera pas à évaluer le second (-name "*.h" -exec echo {} \;
), à la place ne fait rien. Vous voyez, toute la partie après -o
est une expression. Par conséquent, ceci n'est exécuté que pour les fichiers qui correspondent à la deuxième expression. C'est pourquoi vous ne voyez que le 1.h
file, qui ne transmet que la seconde expression. Voir la page de manuel de recherche :
expr1 -o expr2
Or; expr2 is not evaluated if expr1 is true.
Pourquoi est-ce utile ? Considérez ce qui suit :
find /path -exec test_file_for_something {} -print \; -o -name "xyz" -exec ls -l {} \;
Dans cette instruction de recherche, le fichier est donné à test_file_for_something
comme paramètre. Maintenant, en fonction du code de retour des commandes, la première expression est vraie (puis -print
est exécuté et il s'arrête là) ou faux (puis la deuxième expression après le -o
drapeau est évalué). Et si celui-ci est vrai (le nom est xyz
), puis -exec
est exécuté.
Pour votre problème, vous pouvez plutôt l'utiliser pour regrouper les éléments en une expression :
find . \( -name "*.cpp" -o -name "*.h" \) -exec echo {} \;