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 '{}' \+
+
al final?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). Quefind --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' ')'
.Respuestas:
Debe eliminar las comillas simples que usa
{}
. El comando se puede simplificar así:Si usa una versión arcaica de búsqueda de GNU, esto debería funcionar:
fuente
{}
no tiene un significado específico para el shell.“Argumento perdido para
-exec
” generalmente significa que el argumento para -exec
falta su terminador. El terminador debe ser un argumento que contenga solo el carácter;
(que debe citarse en un comando de shell, por lo que normalmente está escrito\;
o';'
), o dos argumentos sucesivos que contengan{}
y+
.Stephane Chazelas ha identificado que está utilizando una versión anterior de GNU find que no es compatible
-exec … {} +
, solo-exec {} \;
. Aunque GNU fue un adoptador tardío-exec … {} +
, le recomiendo que obtenga un conjunto de herramientas menos antiguo (como Cygwin , que incluye git y mucho más, o GNUwin32 , que carece de git pero no tiene el mal trato de los empleados -to-use-linux-but-we-imponee-windows vibe que ofrece Cygwin). Esta característica se agregó en la versión 4.2.12, hace más de 9 años (fue la última característica identificada para hacer que GNU seafind
compatible con POSIX).Si usted quiere meter a un hallazgo de GNU mayores, puede utilizar
-print0
conxargs -0
para conseguir una funcionalidad similar: agrupados ejecución de comandos, el apoyo a los nombres de archivos arbitrarios.Siempre cite los comodines en la
find
línea de comando. De lo contrario, si ejecuta este comando desde un directorio que contiene.c
archivos, lo no entrecomillado*.c
se expandirá a la lista de.c
archivos en el directorio actual.Agregar
/dev/null
a lagrep
línea de comando es un truco para garantizar que grep siempre imprima el nombre del archivo, incluso sifind
encuentra una sola coincidencia. Con GNU find, otro método es pasar la opción-H
.fuente
Si un comando como
devuelve error
la causa probable es GNU demasiado antigua
find
que no admite la sintaxis-exec mycommand {} +
. En ese caso, se debe ejecutar un reemplazo de bajo rendimiento-exec mycommand {} \;
que ejecutarámycommand
una vez para cada objetivo encontrado en lugar de recolectar múltiples objetivos y ejecutarmycommand
solo una vez.Sin embargo, GNU
find
no es compatible, p. Ej.porque GNU
find
solo admite combinaciones literales en{} +
lugar de más genéricas{} additional parameters +
. Tenga en cuenta que no puede haber nada entre las llaves y el+
personaje. Si intenta esto, obtendrá el mismo error:La solución alternativa es usar la sintaxis
{} additional parameters \;
que funciona pero ejecutará el comando una vez para cada objetivo encontrado. Si necesita más rendimiento con GNUfind
, debe escribir un script de envoltura que pueda agregar parámetros adicionales a los argumentos dados. Algo comoDebería ser lo suficientemente bueno. O, si no desea crear un archivo temporal, puede usar una línea para cambiar el orden de parámetros como este:
que ejecutará
mycommand {list of ttf files} extra arguments
. Tenga en cuenta que es posible que tenga que escapar dos caracteres especiales para el bash después de la-c
bandera.fuente
find
, sino el comportamiento correcto especificado por POSIX .find
, probablemente tienes GNUcp
. En este caso, podríafind ... -exec cp --target-directory ~/.fonts {} +
mantener el{}
al final de la cadena de ejecución.find . -type f -perm 0777 -exec chmod 644 {}\;
error conseguido
find: missing argument to ``-exec'
.Añadiendo espacio entre
{}
y\
arreglado:find . -type f -perm 0777 -print -exec chmod 644 {} \;
fuente
find
comando en la pregunta en cuestión.+
forma de la-exec
opción defind
. Esta respuesta está corrigiendo un problema que el usuario que hace la pregunta no tiene.Tuve mi parte de dolores de cabeza con la sintaxis ejecutiva en el pasado. la mayoría de los días ahora prefiero la sintaxis más agradable de bash:
Tiene algunas limitaciones cuando desea tratar los archivos como un grupo, ya que cada uno se evalúa en serie, pero puede canalizar la salida en otro lugar muy bien
fuente
find … -exec … \;
, por lo que no hay razón para usarlo, incluso si sabe que sus nombres de archivo son mansos.exec
fue demasiado dolor de cabeza durante los 5 minutos que quería dedicarme a esto. Mis nombres de archivo eran mansos y esto resolvió mi problema :)