Estoy tratando de ejecutar el siguiente comando:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
Esto está devolviendo un error:
find: missing argument to -exec
No puedo ver qué hay de malo con este comando, ya que parece coincidir con la página del manual:
-exec comando {} +
Esta variante de la opción -exec ejecuta el comando especificado en los archivos seleccionados, pero la línea de comando se crea agregando cada nombre de archivo seleccionado al final; El número total de invocaciones del comando será mucho menor que el número de archivos coincidentes. La línea de comando se construye de la misma manera que xargs construye sus líneas de comando. Solo se permite una instancia de '{}' dentro del comando. El comando se ejecuta en el directorio de inicio.
También probé:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' '{}' +
find a/folder b/folder -name "*.c" -o -name "*.h" -exec grep -I foobar '{}' +
find a/folder b/folder \( -name *.c -o -name *.h \) -exec grep -I foobar '{}' +
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+
find
. Aunque la -exec cmd {} +
variante es POSIX y ha estado disponible desde los años 80, GNU find solo la agregó (relativamente) recientemente (2005). Que find --version
te dice
-exec {} +
se agregó en 4.2.12 en 2005. En versiones anteriores de GNU, puede usar (no POSIX) -print0 | xargs -r0
para obtener algo similar. 4.1
es de 1994.
-name
argumentos del patrón se debe citar: -name "*.c" -o -name "*.h"
. Esto es cierto, aunque no está relacionado con el -exec
error. Notarás que todas las otras respuestas ponen los comodines entre comillas, aunque solo Gilles lo menciona. … (Continúa)
-name "*.[ch]"
sin explicación. Esto tiene los beneficios de simplificar la línea de comando y, específicamente, eliminar el -o
. Encontrar expresiones que involucren -o
es difícil de acertar. El tuyo está mal; Si su comando se corrige para que no se produzca un error (como en la respuesta de Gilles), solo se ejecutará grep
en los .h
archivos. Que tiene que hacer '(' -name '*.c' -o -name '*.h' ')'
.
+
al final?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+