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 --version
te 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 -r0
para obter algo semelhante. 4.1
é de 1994.
-name
argumentos padrão deve ser citado: -name "*.c" -o -name "*.h"
. Isso é verdade, embora não esteja relacionado ao -exec
erro. 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 grep
apenas nos .h
arquivos. Você precisa fazer '(' -name '*.c' -o -name '*.h' ')'
.
+
do final?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+