Ack - 不重复使用标志忽略多个目录

39

在使用Ack时,是否可以忽略多个目录而不需要重复使用标志?

例如,我知道以下内容可行(即设置多个标志):

ack --ignore-dir=install --ignore-dir=php 'teststring'
我希望我可以用逗号分隔目录,就像我可以用以下方式做扩展名一样:
ack --ignore-file=ext:css,scss,orig 'teststring'

然而,以下逗号分隔的忽略标志不起作用:

ack --ignore-dir=install,php 'textstring'

有没有可能使用一些简写形式,这样我就不必反复键入--ignore-dir标志了?

4个回答

56

这实际上类似于您指定 grep 的包含模式的方式:

ack <term> --ignore-dir={dir_a,dir_b}

但是,这种格式无法针对单个目录使用。因此,以下指令将不起作用:

ack <term> --ignore-dir={log}


15
请注意,{} 语法会导致 bash 扩展 - 这不仅适用于 ack。请在命令行上尝试运行以下命令:echo this is cool{1,2} - AgentLiquid
@AgentLiquid 我不知道那个。谢谢! :) - Mandar Pathak
9
需要强调的是,花括号扩展是Bash特有的功能,因此您无法在.ackrc文件中利用它。相反,您需要逐个列出每个--ignore-dir=选项。 - wpcarro
我发现目录名称之间的空格很重要:ack <term> --ignore-dir={dir_a,dir_b} 是可以工作的,但是 ack <term> --ignore-dir={dir_a, dir_b} 就不行。 - kip2

22

由于您正在使用ack 2,您可以在项目根目录下的 .ackrc 文件中添加 --ignore-dir=install--ignore-dir=php。然后,在该项目树中的每个 ack 调用都将使用这些标志。


18

要忽略单个目录,请使用以下命令:

ack <term> --ignore-dir=dir_a

要忽略多个目录,使用

ack <term> --ignore-dir={dir_a,dir_b}

注意:不要在多个目录和逗号之间放置空格。 - Nick Res

0

一种方法是使用正则表达式在-G选项中选择要排除的目录,并与--invert-file-match选项相结合。根据您的问题,可以尝试以下内容:

ack -a -G 'install|php' --invert-file-match 'textstring' .

有趣,但我认为在Ack 2中这不可行。我收到以下消息: 在ack 2中选项“-a”无效。 这是因为我们现在有了-k / --known-types,它使其仅选择已知类型的文件,而不是任何文本文件(这是ack 1.x的行为)。 您可能在.ackrc或ACKRC_OPTIONS环境变量中设置了选项。 尝试使用--dump标志。 - SparrwHawk
@Birei的解决方案仅适用于ack 1.x。在ack 2中,-a和-G标志已被删除,取而代之的是-x标志。 - Andy Lester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接