GNU/Linux >> Tutoriales Linux >  >> Linux

¿`find` con múltiples `-name` y `-exec` ejecuta solo las últimas coincidencias de `-name`?

Cuando estoy usando

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"

encuentra todos los tipos de archivo. Pero cuando agrego -exec al final:

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} ;

parece que solo imprime .txt archivos ¿Qué estoy haciendo mal?

Nota:usando MINGW (Git Bash)

Respuesta aceptada:

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"

es la abreviatura de:

find . ( ( -type f -a -name "*.htm*" ) -o 
          ( -name "*.js*" ) -o 
          ( -name "*.txt" ) 
       ) -a -print

Es decir, porque ninguna acción se especifica el predicado (solo condiciones ), un -print la acción se agrega implícitamente para los archivos que coinciden con las condiciones.

(y, por cierto, eso imprimiría un .js no regular archivos (el -type f solo se aplica a .htm archivos)).

Mientras:

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" 
  -exec sh -c 'echo "$0"' {} ;

es la abreviatura de:

find . ( -type f -a -name "*.htm*" ) -o 
       ( -name "*.js*" ) -o 
       ( -name "*.txt" -a -exec sh -c 'echo "$0"' {} ; )

Para find (como en muchos idiomas), Y (-a; implícito cuando se omite) tiene prioridad sobre OR (-o ), y agregar un predicado de acción explícito (aquí -exec ) cancela el -print acción implícita vista arriba. Toma, quieres:

find . -type f ( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ) 
  -exec sh -c 'echo "$0"' {} ;

O:

find . -type f ( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ) -exec sh -c '
   for i do
     echo "$i"
   done' sh {} +

Para evitar ejecutar un sh por archivo.


Linux
  1. Rotar y archivar registros con el comando logrotate de Linux

  2. Ver comandos y tareas con el comando watch de Linux

  3. CloudCross:sincronice archivos y directorios con múltiples almacenamientos en la nube

  4. Obtener información con el comando vsish (solo esxi)

  5. Mi gestor de arranque no se puede compilar con gcc 4.6 y 4.7 ... solo 4.5

Los comandos alias y unalias explicados con ejemplos

¿Cómo ejecutar Grep con patrones múltiples y?

¿Cómo seguir la salida -f con colores usando solo Awk y mostrar el resto de la salida?

crear tar con múltiples directorios y ubicaciones de archivos

múltiples interfaces físicas con IP en la misma subred

Grep en un archivo de registro enorme (> 14 GB) ¿solo los últimos x GB?