-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 

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

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 не будет сообщать о каком-либо файле там.

  • Почему он находит файл dir -name и не находит файл -n dir?
  • Как перебирать файлы и удалять те, кто старше x дней, но НЕ используется
  • Параметры поиска mtime и ctime
  • Добавить путь к имени файла
  • Как искать файл и перемещаться в несколько каталогов назначения?
  • find и rsync оба дросселя по нечетно названному файлу
  • Изменение прав собственности файла без ошибок
  • Применение функции bash для каждого файла в подпапке рекурсивно
  • find -exec rm для нескольких файлов
  • Только путь к файлу печати, без имени файла
  • Изменение имени файла с нижнего регистра на верхний регистр рекурсивно
  • Различное поведение между find -exec и piping через xargs
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.