如何在 ack(ack-grep)中排除特定文件?

64

使用普通的 grep 命令时,有一个 --exclude 选项(在这里有详细介绍:使用 grep --exclude/--include 语法不搜索特定文件),它可以让你在 grepping 时忽略特定文件。

Ack 的 --type 选项可以处理95%的需要排除文件的情况,但是它似乎不能处理排除特定文件的情况。我有一个编译过的 JS 文件,其中包含每个其他 JS 文件的内容(单行),因此每次 grep 任何内容时,都会返回该巨大编译文件的全部内容。

我不想因为这个问题而放弃 ack 并回到 grep,但这真的很烦人。请问有没有办法在 ack 搜索中排除特定文件?

5个回答

118
为了使用 ack 2.0 忽略单个文件,需要向 --ignore-file 标志提供一个筛选规范(filter spec):--ignore-file=is:cljout.js

3
“is:”在这里的作用是什么? - Explosion Pills
5
精确的文件名匹配。http://beyondgrep.com/documentation/ack-2.04-man.html#is_filename - Paul Bissex
8
这个对于文件名来说可行,但如果我想要指定一个具体的文件(即路径和文件名),就不适用了。 - tremby
13
您可以使用正则表达式和 match 来匹配文件名,使用 ext 来匹配扩展名。通过添加 --ignore-file=ext:js 可以排除 js 文件。通过添加 --ignore-file='match:/foo|bar/' 可以排除名称为 foo 和 bar 的文件。如果正则表达式中含有 |,请用引号转义参数,以防止 shell 将其解释为管道符。 - xtreak
6
这个“is:”的东西实在是太不明显,让人很困扰。 - Steven Lu
显示剩余3条评论

30

如果运行ack --create-ackrc命令,它会输出一堆常见文件预设,例如压缩的JavaScript、CSS以及像node_modules和.git这样的目录。非常有用!

下面是压缩的JavaScript选项:

# minified Javascript
--ignore-file=match:/[.-]min[.]js$/
--ignore-file=match:/[.]js[.]min$

这里是如何忽略名为foo的目录:

--ignore-directory=is:foo

如果你想将这个保存到 .ackrc ,运行:

ack --create-ackrc >> ~/.ackrc

然后从那个文件中删除你不需要的内容。

另外,你可以在项目的根目录中创建另一个.ackrc文件来处理项目特定的东西。我将它放在.gitignore中,这样它就不会混乱了。


1
我相信 --ignore-directory 不像 --ignore-file 一样接受 is: 这样的过滤器。--ignore-directory 只接受一个目录名。 - Julian Mehnle

17
不,ack 1.x无法让你排除单个文件。在ack 2.0中可以实现。ack 2.0是当前推荐使用的版本,不再处于第一个alpha版。
对于你提到的压缩过的Javascript文件,你使用的是哪个版本的ack?ack 1.96应该会根据扩展名忽略掉压缩过的JavaScript文件。如果扩展名检查不起作用,因为它是一个单独的Perl程序,所以你可能可以修改ack本身。您可以修改is_searchable函数。
在ack 2.0中,我们正在考虑忽略任何超过500个字符的行,因为这显然不是源代码。
你也可以加入我们的ack-users邮件列表,我们会很快回复。

实际上,我的下一个站点是要去查看ack邮件列表,但我想先在这里检查一下,以确保我没有漏掉什么显而易见的东西 :-) 谢谢Andy。 - machineghost
我正在为编译后的JS文件选择文件名,目前它只是built.js。我将尝试将其重命名为built.min.js,看看是否有帮助。 - machineghost

3

3

如果您想排除特定的文件夹,下面的命令可能会帮助到您:

ack 关键词 --ignore-dir 文件夹名称

man ack 将提供更多细节 :)

--[no]ignore-dir=文件夹名称, --[no]ignore-directory=文件夹名称

--ignore-file=筛选类型:筛选参数


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