Saltar al contenido

encontrar: argumento faltante para -exec

Este equipo de trabajo ha pasado mucho tiempo buscando soluciones a tus dudas, te dejamos la resolución por esto nuestro objetivo es servirte de gran apoyo.

Solución:

Hubo varios problemas con sus intentos, incluidos los acentos graves utilizados en lugar de comillas (eliminados en ediciones posteriores de la pregunta), comillas faltantes donde son necesarias, comillas adicionales donde son inútiles, paréntesis faltantes para agrupar -o cláusulas y diferentes implementaciones de findutilizado (ver los comentarios y el chat para más detalles).

De todos modos, el comando se puede simplificar así:

find a/folder b/folder -name "*.[ch]" -exec grep -I foobar  +

o, si usa una versión arcaica de búsqueda de GNU, esto siempre debería funcionar:

find a/folder b/folder -name "*.[ch]" -exec grep -I foobar  ;

“argumento faltante para -exec” por lo general significa que el argumento para –exec le 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 se escribe ; o ';'), o dos argumentos sucesivos que contengan y +.

Stephane Chazelas ha identificado que está utilizando una versión anterior de GNU find que no admite -exec … +solamente -exec ;. Aunque GNU fue un adoptador tardío de -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-empleado-intentando-usar-linux- pero-imponemos-la vibra de Windows que da 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 find compatible con POSIX).

Si desea apegarse a una búsqueda de GNU más antigua, puede usar -print0 con xargs -0 para obtener una funcionalidad similar: ejecución de comandos agrupados, compatible con nombres de archivos arbitrarios.

find a/folder b/folder -name '*.c' -o -name '*.h' -print0 | xargs -0 grep -I foobar /dev/null

Siempre cite los comodines en el find línea de comando. De lo contrario, si ejecuta este comando desde un directorio que contiene .c archivos, el sin comillas *.c se ampliaría a la lista de .c archivos en el directorio actual.

agregando /dev/null al grep línea de comando es un truco para asegurar que grep siempre imprimirá el nombre del archivo, incluso si find pasa a encontrar una sola coincidencia. Con GNU find, otro método es pasar la opción -H.

Si un comando como

find a/folder b/folder -name "*.c" -o -name "*.h" -exec grep -I foobar  +

devuelve un error

find: missing argument to -exec

la causa probable es un GNU demasiado antiguo find que no admite sintaxis -exec mycommand +. En ese caso, el reemplazo de bajo rendimiento es ejecutar -exec mycommand ; que ejecutará el mycommand una vez por cada objetivo encontrado en lugar de recolectar múltiples objetivos y ejecutar el mycommand sólo una vez.

Sin embargo, GNU find no es compatible, por ejemplo

find . -type f -and -name "*.ttf" -exec cp  ~/.fonts +

porque GNU find solo admite combinaciones literales + en lugar de más genérico additional parameters +. Tenga en cuenta que no puede haber nada entre las llaves y el + personaje. Si intenta esto, obtendrá el mismo error:

find: missing argument to -exec

La solución es utilizar la sintaxis additional parameters ; que funciona pero ejecutará el comando una vez por cada objetivo encontrado. Si necesitas más rendimiento con GNU find debe escribir un script contenedor que pueda agregar parámetros adicionales a los argumentos proporcionados. Algo como

#!/bin/bash
exec mycommand "[email protected]" additional parameters

debería ser lo suficientemente bueno. O, si no desea crear un archivo temporal, puede usar una sola línea para cambiar el orden de los parámetros como este:

find . -type f -and -name "*.ttf" -exec bash -c 'mycommand "[email protected]" extra arguments'  +

que se ejecutará mycommand list of ttf files extra arguments. Tenga en cuenta que es posible que deba usar caracteres especiales de doble escape para el bash después del -c bandera.

Valoraciones y reseñas

Te invitamos a sostener nuestro trabajo exponiendo un comentario y valorándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *