ack: Exclude specific directories from search via

2020-05-20 08:44发布

问题:

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.

回答1:

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.



回答2:

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



回答3:

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.



回答4:

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 (still open) GitHub issue 291.



标签: regex ack