GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi `find` sous Linux ignore-t-il les résultats attendus lorsque `-o` est utilisé ?

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 {} \;

Linux
  1. Pourquoi ce pipeline shell sort-il ?

  2. Pourquoi le préprocesseur C interprète-t-il le mot linux comme la constante 1 ?

  3. Pourquoi Linux utilise-t-il une partition swap plutôt qu'un fichier ?

  4. Pourquoi Linux chauffe-t-il mon ordinateur ?

  5. Pourquoi le trafic réseau Linux ne passe-t-il que par eth0 ?

Qu'est-ce que POSIX ? Pourquoi est-ce important pour les utilisateurs Linux/UNIX ?

Pourquoi la synchronisation est-elle si importante lors de la création d'une clé USB Linux amorçable ?

Qu'est-ce que la commande Grep sous Linux ? Pourquoi est-il utilisé et comment fonctionne-t-il ?

Pourquoi cette regex ne fonctionne-t-elle pas sous Linux ?

Sous Linux, à partir de quand le temps de disponibilité commence-t-il à compter ?

Pourquoi Swap est-il utilisé lorsqu'il reste beaucoup de mémoire libre ?