¿Por qué el order de los parameters afecta a los files encontrados por `find`?

Encontré este extraño comportamiento en find . Dependiendo del order de los parameters para find , encuentra diferentes files.

Por ejemplo, tengo un tree de directorys con el siguiente contenido.

 . ├── configure.ac ├── Makefile.am └── src ├── hello.c └── Makefile.am 

si corro

 find -name '*.cpp' -o -name '*.[chS]' -print0 | xargs -0 echo 

Lista

 ./src/hello.c 

Y si corro

 find -name '*.[chS]' -o -name '*.cpp' -print0 | xargs -0 echo 

No enumera nada. Tenga en count que lo único que cambié es el order del nombre del file.

¿Alguien puede explicar por qué el segundo command no enumera ningún file?

La acción -print0 se vincula solo al segundo "filter" de nombre (testing en el lenguaje de búsqueda), por lo que solo imprimirá algo si el segundo filter coincide. Esto se debe a que el operador pnetworkingeterminado en la expresión de búsqueda es and , y se une más que or ( -o ). es decir, su segunda expresión se evalúa como:

 find -name '*.[chS]' -o \( -name '*.cpp' -print0 \) | xargs -0 echo 

Intenta agrupar los filters:

 find \( -name '*.[chS]' -o -name '*.cpp' \) -print0 | xargs -0 echo 

También podría hacer esto si le da la gana:

 find -name '*.[chS]' -print0 -o -name '*.cpp' -print0 | xargs -0 echo