Estou tentando executar o seguinte comando:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
Isso está retornando um erro:
find: missing argument to -exec
Não vejo o que há de errado com este comando, pois parece corresponder à página de manual:
comando -exec {}
Essa variante da opção -exec executa o comando especificado nos arquivos selecionados, mas a linha de comando é criada anexando cada nome de arquivo selecionado no final; o número total de invocações do comando será muito menor que o número de arquivos correspondentes. A linha de comando é construída da mesma maneira que o xargs cria suas linhas de comando. Somente uma instância de '{}' é permitida dentro do comando. O comando é executado no diretório inicial.
Eu também tentei:
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. Embora a -exec cmd {} +variante seja POSIX e esteja disponível desde os anos 80, o GNU encontrou apenas a adição (relativamente) recentemente (2005). O que find --versionte diz?
-exec {} +foi adicionado em 4.2.12 em 2005. Nos achados mais antigos do GNU, você pode usar o (não POSIX) -print0 | xargs -r0para obter algo semelhante. 4.1é de 1994.
-nameargumentos padrão deve ser citado: -name "*.c" -o -name "*.h". Isso é verdade, embora não esteja relacionado ao -execerro. Você notará que todas as outras respostas colocam os curingas entre aspas, embora apenas Gilles o mencione. … (Continua)
-name "*.[ch]"sem explicação. Isso tem os benefícios de simplificar a linha de comando e, especificamente, eliminar o -o. -oÉ difícil encontrar expressões que envolvam isso. O seu está errado; se o seu comando for corrigido para não causar erros (como na resposta de Gilles), ele será executado grepapenas nos .harquivos. Você precisa fazer '(' -name '*.c' -o -name '*.h' ')'.
+do final?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+