Подтвердить что ты не робот

Ack: исключить определенные каталоги из поиска через регулярное выражение

Как игнорировать определенные каталоги через RegEx с помощью ack?

Я могу использовать параметр --ignore-dir, но это не позволяет мне указывать RegEx. Я хочу иметь возможность игнорировать любой каталог, в котором есть слова test или tests или более сложные шаблоны в его имени.

Я также попробовал отрицательный lookbehind через

ack -G '(?<!test)' pattern

но это не работает. Это не исключает каталоги test.

4b9b3361

Ответ 1

Использовать недокументированную опцию "-invert-file-match" (версия ack в моей системе: 1.96):

$ ack pattern -G 'test|tests' --invert-file-match

Ну, это задокументировано:

$ ack --help|grep invert
-v, --invert-match    Invert match: select non-matching lines
--invert-file-match   Print/search handle files that do not match -g/-G.

Он не задокументирован в perldoc.

Ответ 3

В интересах людей, использующих версию ack до 1,96 (как и я), вы можете использовать regex look around для этого. Вот пример:

ack --java 'text-pattern' -G '^((?!(test|target)).)*$'

Это будет искать text-pattern во всех Java файлах рекурсивно (из.), которые НЕ имеют слов test или target в своем пути.

Ответ 4

В последних версиях ack вы можете использовать регулярные выражения с --ignore-dir.

От этот поток:

Да, в 2.15_01 мы добавили:

  • ack теперь поддерживает --ignore-dir = match:.... Спасибо, Айлин Немюй! (Билет GitHub № 42).

Ссылка GitHub: https://github.com/petdance/ack2/issues/42

К сожалению, я думаю, что это поддерживает только имя базового каталога, а не полный путь.

Например, вы не можете сопоставить с ним путь, например ".*/docs/generated/.*".

Для этого см. (все еще открыт) GitHub issue 291.