“missing argument to -exec ” geralmente significa que o argumento para - exec está faltando seu terminador. O terminador deve ser um argumento contendo apenas o caractere ; (que precisa ser citado em um comando shell, por isso, geralmente é escrito \; ou ';' ) ou dois argumentos sucessivos contendo {} e + .
Stephane Chazelas identificou que você está usando um antigo versão do GNU que não suporta -exec … {} + , apenas -exec {} \; . Embora o GNU tenha adotado tardiamente o -exec … {} + , recomendo que você adquira um conjunto de ferramentas menos antigo (como o Cygwin , que inclui git e muito mais, ou GNUwin32 , que não tem git, mas não tem o mau funcionário-tentando-de-usar- linux-but-we-impose-windows vibe que o Cygwin dá). Este recurso foi adicionado na versão 4.2.12, há mais de 9 anos (foi o último recurso identificado a tornar o GNU find compatível com POSIX).
Se você quiser se ater a um GNU find mais antigo, você pode usar -print0 with xargs -0 para obter uma funcionalidade semelhante: a execução de comandos agrupados, suportando nomes de arquivos arbitrários.
find a/folder b/folder -name '*.c' -o -name '*.h' -print0 | xargs -0 grep -I foobar /dev/null
Sempre cite os curingas na linha de comando find . Caso contrário, se você executar este comando a partir de um diretório contendo .c files, o *.c sem aspas seria expandido para a lista de .c files no diretório atual.
Adicionar /dev/null à linha de comando grep é um truque para garantir que o grep sempre imprima o nome do arquivo, mesmo se find encontrar uma única correspondência. Com o GNU find, outro método é passar a opção -H .