find: argumento ausente para -exec

6

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 consigo ver o que há de errado com esse comando, pois ele parece corresponder à página do manual:

-exec command {} +

This variant of the -exec option runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the total number of invoca- tions of the command will be much less than the number of matched files. The command line is built in much the same way that xargs builds its command lines. Only one instance of '{}' is allowed within the command. The command is executed in the starting directory.

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 '{}' \+
    
por David Kennedy 07.05.2014 / 23:10

4 respostas

8

Você precisa remover os backticks que você usa em {}. O comando pode ser simplificado assim:

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

Se você usar uma versão arcaica do GNU find, isso ainda funcionará:

find a/folder b/folder -name "*.[ch]" -exec grep -I foobar {} \;
    
por 07.05.2014 / 23:18
3

“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 .

    
por 08.05.2014 / 05:40
0

quando eu estava usando da seguinte maneira

"$ sudo find. -tipo f -perm 0777 -exec chmod 644 {} \;"

então eu estava recebendo este erro "find: missing argument to '-exec'"

quando fiz um espaço entre '{}' e '\'. Ficou consertado.

"sudo find. -tipo f -perm 0777 -print -exec chmod 644 {} \;"

    
por 17.08.2018 / 11:21
-1

Eu tive minha cota de dores de cabeça com a sintaxe exec no passado. A maioria dos dias agora eu prefiro a sintaxe de bash mais agradável:

for f in 'find a/folder b/folder -name "*.[ch]"'; do grep -I foobar $f; done

Ele tem algumas limitações quando você quer tratar os arquivos como um grupo, já que cada um é avaliado em série, mas você pode canalizar a saída em outro lugar bem

    
por 08.05.2014 / 05:27

Tags