1

Примечание: это не дубликат. Я имею в виду определенный случай, когда параметры grep для исключения путей / каталогов не ведут себя ожидаемым образом.

Я пытаюсь использовать grep для рекурсивного поиска в моей корневой файловой системе. Я пытаюсь исключить определенные каталоги, такие как /proc , /sys и /usr/local . Если я использую --exclude-dir=${DIR_NAME} , то он не будет искать пути ниже ${DIR_NAME} , но это также будет означать, что он откажется искать пути ниже ${DIR_NAME} если ${DIR_NAME} равен на уровне ниже текущего рабочего каталога. В качестве примера рассмотрим это дерево файловой системы:

${PWD}/
  data/
    settings/
      sys/
    users/
      developer/
        projects/
          my_os/
            build/
            src/
              apps/
              sys/
            Makefile
  extras/
  sys/
    apps/
    os/

Если я хочу, чтобы мой поиск исключал ${PWD}/sys и все, что под ним, grep -rl --exclude-dir=sys исключит его, но также исключит ${PWD}/data/settings/sys и ${PWD}/users/developer/projects/my_os/src/sys , две директории, которые я хочу включить в свой поиск.

Первоначально я надеялся, что --exclude-dir/--exclude будет разрешать регулярные выражения, и я нашел этот комментарий, указывающий, что они делают, но кажется, что синтаксис регулярных выражений не влияет на поведение утилиты (например, "^/(dev|proc)"). Я в порядке, если эти два параметра не используют регулярные выражения, но я не хочу, чтобы шаблон исключения применялся к отдельным компонентам пути. Есть ли способ заставить его работать так?

1 ответ1

1

Просто используйте это:

grep -r "text" | grep -i -v ^sys/ 

Вы можете добавить столько «| grep -i -v ^ dir/», сколько вам нужно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .