¿Por qué buscar y ejecutar con múltiples condiciones no funciona sin paréntesis?

1

Tengo dos comandos find muy similares, solo uno de los cuales funciona. Como es relevante, debo mencionar que no hay archivos con las extensiones .c o .hpp .

# That one works
find ~/src/ \( -type f -iname '*.cpp' -or -iname '*.h' -or -iname '*.c' -or -iname '*.hpp' \) -exec echo {} \;
# That one doesn't
find ~/src/ -type f -iname '*.cpp' -or -iname '*.h' -or -iname '*.c' -or -iname '*.hpp' -exec echo {} \;
    
pregunta assp1r1n3 08.07.2016 - 23:15

1 respuesta

1

Bueno, ninguno funciona como esperas. Veamos el que "no funciona" y apliquemos los paréntesis y la lógica implícitos.

find ~/src \( -type f -a -iname '*.cpp' \) -or \( -iname '*.h' \) -or \( -iname '*.c' \) -or \( -iname '*.hpp' \) -exec echo {} \;

No se aplica ninguna acción a los archivos que terminan en cpp, ni a los objetos del sistema de archivos que terminan en h y c. Solo los objetos del sistema de archivos que terminan en hpp tienen eco porque -exec niega el comportamiento predeterminado de find para imprimir. Puedes agregar -exec echo {} \; o -print al final de cada paréntesis, pero eso es una tontería.

Corrigamos el "uno que funciona"

find ~/src -type f \( -iname '*.cpp' -or -iname '*.h' -or -iname '*.c' -or -iname '*.hpp' \) -exec echo {} \;
    
respondido por el fd0 09.07.2016 - 14:05

Lea otras preguntas en las etiquetas