ack: исключить определенные каталоги из поиска с помощью регулярных выражений

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

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

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

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

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


person cschol    schedule 29.12.2011    source источник


Ответы (4)


Используйте недокументированную опцию "--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.

person holygeek    schedule 29.12.2011
comment
Потрясающе -- спасибо! На справочной странице, которую я просматриваю, об этом тоже ничего нет, но это работает. - person AmigoNico; 04.07.2013

С ack2 кажется, что вы не можете использовать решение Holygeek.

Вот как бы я это сделал, используя -v и -x:

ack -v -g 'test' | ack -x pattern

В более общем случае 'test' может быть регулярным выражением для исключений из каталогов.

person lajarre    schedule 20.09.2013
comment
Ведь для ack2 это то, что нужно. Спасибо! - person igniteflow; 23.02.2015

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

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

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

person baja    schedule 20.08.2012
comment
Что означает эта конструкция '^((?!(test|target)).)*$'? - person Scit; 12.11.2013

В последних версиях 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.

обновление на 2020 год: похоже, теперь это перенесено в ack3 (ошибка github).

person jwd    schedule 15.03.2017