find / grep gera duas linhas para cada arquivo encontrado

3

Eu pesquiso minha base de código para encontrar padrões de string e listar todos os arquivos em que o padrão é encontrado, mas apenas o arquivo e não as linhas em que ele é encontrado:

find . -name *.java -exec grep -l 'someText' {} \; -print 2>/dev/null

No entanto, gera duas linhas para cada arquivo encontrado. Por que isso acontece e como devo modificar o comando para listar nomes de arquivos exclusivos?

    
por amphibient 06.02.2014 / 23:04

1 resposta

6

grep imprime nomes de arquivos E retorna um valor True / False; Se o valor for True, a ação -print imprimirá o arquivo. Então você tem duas possibilidades:

find . -name '*.java' -exec grep -l 'someText' {} \;  2>/dev/null

ou

find . -name '*.java' -exec grep -q 'someText' {} \; -print 2>/dev/null

E lembre-se de citar *.java . Caso contrário, o shell pode expandi-lo para a lista de arquivos java no diretório atual.

Observe também que você não precisa executar um grep por arquivo, é melhor você fazer isso:

find . -name '*.java' -exec grep -l 'someText' {} +  2>/dev/null

Observe que 2>/dev/null suprime os erros de find e grep . Se você quiser apenas tornar grep quieto, poderá escrevê-lo:

find . -name '*.java' -exec grep -sl 'someText' {} +

Por fim, observe que a implementação GNU de grep também pode fazer o trabalho de find :

grep -slr --include='*.java' 'someText' .
    
por 06.02.2014 / 23:15

Tags