-não-nome não funciona com o find

6

Estou tentando usar o find / grep para encontrar alguns padrões de texto na minha base de código. Desejo excluir diretórios que não sejam de origem nos quais meu processo de compilação duplique arquivos de origem:

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

Infelizmente, ainda recebo diretórios de segmentação no resultado, por exemplo:

./toplevel/src/com/domain/toplevel/module/SourceFile.java

O que estou fazendo de errado e como corrigi-lo?

    
por amphibient 06.02.2014 / 23:26

1 resposta

7

-name pattern corresponde ao nome do arquivo. SourceFile.java não corresponde a *pattern* , por isso está incluído. Se você não quiser descer em diretórios cujo nome contenha target , será necessário:

find . -name '*target*' -prune -o -name '*.java' \
  -exec grep -sl 'someText' {} +

(lembre-se de citar os padrões, caso contrário eles podem ser expandidos pelo shell).

Por vários padrões:

find . \( -name 'pattern1' -o -name 'pattern2' \) -prune \
  -o -name '*.java' -exec grep -sl 'someText' {} +

(AND ( -a ) está implícito quando não especificado entre dois predicados. AND tem precedência sobre OR ( -o ), daí os colchetes acima).

Observe que ! é o equivalente portátil / padrão de -not .

Se você quiser corresponder no caminho completo, precisará usar -path como:

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

Mas isso não impede que find desça para *target* diretórios, o que é um desperdício, pois find não reportará nenhum arquivo lá.

    
por 06.02.2014 / 23:32

Tags