Problema combinando -or e -exec com o comando find

5

Eu estou achando que quando eu uso find - ou operador em combinação com -exec, não obtenho o resultado esperado. Ao procurar arquivos .cpp e .h, o comando funciona como esperado se eu não usar -exec:

find . -name '*.cpp' -or -name '*.h'
./file1.cpp
./file1.h
./file2.cpp
./file2.h

No entanto, quando eu uso -exec, apenas os arquivos .h parecem ser passados:

find . -name '*.cpp' -or -name '*.h' -exec echo '{}' \;
./file1.h
./file2.h

Funciona bem quando uso a abordagem mais generalizada para retornar o resultado:

echo $(find . -name '*.cpp' -or -name '*.h')
./file1.cpp ./file1.h ./file2.cpp ./file2.h

No entanto, eu gostaria de saber o que estou fazendo de errado com -exec, já que é mais conveniente. Estou usando o Mac OSX 10.9, mas o mesmo problema ocorre em um terminal Cygwin. O que está errado aqui? Como posso fazer o trabalho -exec do jeito que eu quero?

    
por wonderlr 28.09.2014 / 18:09

1 resposta

7

Isso porque sua ação -exe está vinculada ao nome-* ".h" colocando parênteses em torno da expressão e funcionará. a ação padrão será -print é por isso que a expressão inicial funcionou.

find . \( -name '*.cpp' -or -name '*.h' \) -exec echo '{}' \;

Também para eficiência, se você usar | xargs em vez de -exec é muito mais rápido com um grande conjunto de resultados, pois executará um único comando com a lista como argumento em vez de uma chamada individual por item retornado.

    
por 28.09.2014 / 18:28

Tags