GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué `find` en Linux omite los resultados esperados cuando se usa `-o`?

Creo que una vez usaste -or operador, entonces debe mantenerlo consistente para evitar un orden ambiguo de las operaciones lógicas cuando tiene múltiples condiciones conectadas usando OR lógico.

Parece el -exec parte se agrupa junto con el segundo -name "*.h" .

Entonces, para que funcione correctamente, debe agregar los corchetes de la siguiente manera:

find . '(' -name '*.cpp' -o -name '*.h' ')' -exec echo {} ';'

Alternativamente, combine algunas extensiones en una usando -regex :

find . ! -regex ".*\.\(cpp\|h\)" -exec echo {} \;

Ninguno de los dos. Es la sintaxis de las opciones lo que es "incorrecto". find evalúa secuencialmente. Por lo tanto, evalúa la primera expresión (-name "*.cpp" ) luego encuentra un -o bandera. Si la primera expresión es verdadera, find no seguirá evaluando el segundo (-name "*.h" -exec echo {} \; ), en cambio no hace nada. Verás, toda la parte después de -o es una expresión. Por lo tanto, esto solo se ejecuta para los archivos que coinciden con la segunda expresión. Por eso solo ves el 1.h archivo, que pasa sólo la segunda expresión. Consulte la página de manual de búsqueda:

   expr1 -o expr2
          Or; expr2 is not evaluated if expr1 is true.

¿Por qué es útil? Considere lo siguiente:

find /path -exec test_file_for_something {} -print \; -o -name "xyz" -exec ls -l {} \;

En esta declaración de búsqueda, el archivo se entrega a test_file_for_something como parámetro. Ahora, dependiendo del código de retorno de los comandos, la primera expresión es verdadera (entonces -print se ejecuta y termina allí) o falso (entonces la segunda expresión después del -o se evalúa la bandera). Y si eso es cierto (el nombre es xyz ), luego -exec se ejecuta.

Para su problema, puede usar esto para agrupar los elementos como una expresión :

find . \( -name "*.cpp" -o -name "*.h" \) -exec echo {} \;

Linux
  1. ¿Por qué es tan importante la sincronización al hacer una memoria USB de arranque de Linux?

  2. Linux:¿por qué el USB no funciona en Linux cuando funciona en Uefi/bios?

  3. Linux:¿por qué se tarda tanto en detectar una memoria USB?

  4. ¿Por qué sale esta canalización de shell?

  5. ¿Por qué el preprocesador de C interpreta la palabra linux como la constante 1?

Linux – ¿Por qué Locale Es_mx funciona pero no Es?

¿Qué es el comando Grep en Linux? ¿Por qué se usa y cómo funciona?

¿Por qué se usa select en Linux?

¿Por qué tenemos 3 tipos de selecciones X en LINUX?

¿Por qué Ctrl + V no se pega en Bash (shell de Linux)?

¿Por qué el tráfico de red de Linux solo pasa por eth0?