-not -name не работает с поиском

Я пытаюсь использовать find / grep, чтобы найти некоторые текстовые шаблоны в моей базе кода. Я хочу исключить не исходные каталоги, в которые мой процесс сборки дублирует исходные файлы:

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

К сожалению, я все еще получаю целевые каталоги в результате, например:

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

Что я делаю неправильно и как это исправить?

  • найти с ls, но с полным покрытием
  • Как узнать, какие файлы отсутствуют в списке?
  • Есть опция `find`` -exec` в `ack-grep`?
  • find и rsync оба дросселя по нечетно названному файлу
  • Удалите файлы, которые предоставляются по каналу
  • Отключить gzip-ошибки / предупреждения при использовании zgrep
  • Поиск разрешений для файлов, кроме 755
  • rsync: как включить файлы с именем, заканчивающимся в определенной строке
  • One Solution collect form web for “-not -name не работает с поиском”

    -name pattern совпадает с именем файла. SourceFile.java не соответствует *pattern* , поэтому он включен. Если вы не хотите спускаться в каталоги, чье имя содержит target , тогда вам понадобится:

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

    (не забудьте указать шаблоны, иначе они могут быть расширены оболочкой).

    Для нескольких шаблонов:

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

    (AND ( -a ) подразумевается, если не указано между двумя предикатами. AND имеет приоритет над OR ( -o ), следовательно, скобки выше).

    Обратите внимание, что ! является переносным / стандартным эквивалентом -not .

    Если вы хотите совпадения по полному пути, вам нужно использовать -path вместо:

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

    Но это не останавливает find от нисходящих в *target* каталогов, что немного отходы, так как find не будет сообщать о каком-либо файле там.

    Linux и Unix - лучшая ОС в мире.