-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 

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

  • Regex не соответствует файлу с помощью `find`, несмотря на то, что он действителен
  • Найти каталог, если количество файлов превышает X
  • Удалите файлы, указанные в выводе find: rm считает, что список аргументов слишком длинный.
  • Удалите файлы, которые предоставляются по каналу
  • chmod позволяет писать, когда я не устанавливаю его
  • Найдите как обычные файлы, так и каталоги
  • найти файлы в Linux с некоторыми исключениями
  • отсутствующий аргумент для поиска -exec
  • 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 - лучшая ОС в мире.