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