cschol
cschol

Reputation: 13059

ack: Exclude specific directories from search via regex

How do I ignore specific directories via RegEx with ack?

I can use the --ignore-dir option, but this does not let me specify a RegEx. I want to be able to ignore any directory, which has the words test or tests or more complicated patterns in its name.

I also tried a negative lookbehind via

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

but this does not work. It does not exclude the test directories.

Upvotes: 27

Views: 6678

Answers (4)

jwd
jwd

Reputation: 11114

In recent versions of ack, you can use regular expressions with --ignore-dir.

From this thread:

Yes, in 2.15_01 we added:

  • ack now supports --ignore-dir=match:.... Thanks, Ailin Nemui! (GitHub ticket #42)

GitHub link: https://github.com/petdance/ack2/issues/42

Sadly, I think this only supports matching the base directory name, not the full path.

For instance, you cannot match a path like ".*/docs/generated/.*" with it.

For that, see the GitHub issue 291.

update for 2020: it looks like this is now moved to ack3 (github issue).

Upvotes: 6

lajarre
lajarre

Reputation: 5162

With ack2, it seems you can't use holygeek's solution.

Here's how I'd do it using -v and -x:

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

More generally, 'test' can be a regex for dirs to exclude

Upvotes: 11

baja
baja

Reputation: 351

In the interest of folks using a pre-1.96 version of ack (like me), you can use regex look around to do this. Here's an example:

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

This will search the text-pattern in all Java files recursively (from .) that DO NOT have the words test or target in their path.

Upvotes: 5

holygeek
holygeek

Reputation: 16185

Use the undocumented option "--invert-file-match" (ack version on my system: 1.96):

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

Well, it is sort of documented:

$ 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.

It is not documented in its perldoc.

Upvotes: 22

Related Questions