ackを使用して RegEx 経由で特定のディレクトリを無視するにはどうすればよいですか?
オプションを使用でき--ignore-dir
ますが、正規表現を指定できません。test
名前に単語またはtests
より複雑なパターンが含まれているディレクトリを無視できるようにしたい。
私はまた、否定的な後読みを試みました
ack -G '(?<!test)' pattern
しかし、これは機能しません。test
ディレクトリは除外されません。
文書化されていないオプション「--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 には記載されていません。
ack2 では、holigeek のソリューションを使用できないようです。
-v
andを使用してそれを行う方法は次の-x
とおりです。
ack -v -g 'test' | ack -x pattern
より一般的には、'test'
除外するディレクトリの正規表現にすることができます
(私のように) 1.96 より前のバージョンの ack を使用している人々のために、正規表現のルックアラウンドを使用してこれを行うことができます。次に例を示します。
ack --java 'text-pattern' -G '^((?!(test|target)).)*$'
text-pattern
これにより、すべてのファイルが (. から) 再帰的に検索されJava
ますが、その単語test
またはtarget
そのパスにはありません。