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

Posted

技术标签:

【中文标题】如何从 ack (ack-grep) 中排除特定文件?【英文标题】:How do you exclude a specific file from ack (ack-grep)? 【发布时间】:2012-07-23 01:52:19 【问题描述】:

使用普通的grep 命令有一个--exclude 选项(此处详细介绍:Use grep --exclude/--include syntax to not grep through certain files),可让您在 grepping 时忽略特定文件。

Ack 的 --type 选项可以处理 95% 的您想要排除文件的情况,但它不能(据我所知)处理排除特定文件的情况。我有一个已编译的 JS 文件,其中包含所有其他 JS 文件的内容(在一行上),所以每次我 grep for anything 时,我都会返回那个已编译的巨人的全部内容文件。

我不想不得不放弃 ack 并返回 grep 解决这个问题,但它真的很烦人。请有人告诉我有一种方法可以从 ack 搜索中排除特定文件。

【问题讨论】:

【参考方案1】:

要使用 ack 2.0 忽略单个文件,请为 --ignore-file 标志提供过滤规范:

--ignore-file=is:cljout.js

【讨论】:

is: 在这里做什么? 文件名完全匹配。 beyondgrep.com/documentation/ack-2.04-man.html#is_filename 这适用于我的文件名,但如果我想给出一个特定的文件(即路径和文件名)则不行。 您可以使用match 和正则表达式来匹配文件名,使用ext 来匹配扩展名。排除js文件--ignore-file=ext:js。排除名称为 foo 和 bar --ignore-file='match:/foo|bar/' 的文件。在使用 | 的正则表达式的情况下,用引号转义参数,以便 shell 不会将其作为管道执行。 这整个is: 的事情并不明显和烦人【参考方案2】:

如果你运行ack --create-ackrc,它会输出一整套常用文件的预设,比如缩小的 javascript、css 和 node_modules 和 .git 等目录。很有用!

这是缩小的 js 选项:

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

以下是如何忽略名为 foo 的目录:

--ignore-directory=is:foo

如果你想把它保存到.ackrc运行

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

然后从该文件中删除您不需要的内容。

此外,您可以在项目的根文件夹中创建另一个 .ackrc 文件,以存储项目特定的内容。我把它放在 .gitignore 中,这样它就不会弄乱 repo。

【讨论】:

我相信--ignore-directory 不接受像is: 这样的过滤器,就像--ignore-file 一样。 --ignore-directory 只接受一个目录名。【参考方案3】:

不,ack 1.x 不会让您排除单个文件。在ack 2.0,你可以。 ack 2.0 目前处于其第一个 alpha 阶段现在是当前推荐的 ack 版本。

就您的缩小 Javascript 文件的具体情况而言,您使用的是什么版本的 ack? ack 1.96 应该忽略基于扩展的缩小 JavaScript。如果扩展检查不起作用,您可能会自行破解 ack,因为它是一个单独的 Perl 程序。你可以破解is_searchable函数。

在 ack 2.0 中,我们正在考虑忽略任何超过 500 个字符的行,因为它显然不是源代码。

您可能还想加入我们的ack-users 邮件列表。我们反应灵敏。

【讨论】:

事实上,我的下一站将是确认邮件列表,但我想我会先检查这里以确保我没有遗漏一些明显的东西 :-) 谢谢安迪。跨度> P.S.我正在为我编译的 JS 文件选择文件名,所以目前它只是 build.js。我会尝试将其重命名为built.min.js,看看是否有帮助。【参考方案4】:

也很高兴了解 ack2.0,如果您必须经常过滤文件,可以在 .ackrc file 中指定这些选项。

【讨论】:

【参考方案5】:

如果您想排除特定文件夹,以下命令可能对您有所帮助:

ack keywords --ignore-dir folder_name

man ack 将提供更多详细信息:)

--[no]ignore-dir=DIRNAME,--[no]ignore-directory=DIRNAME

--ignore-file=FILTERTYPE:FILTERARGS

【讨论】:

以上是关于如何从 ack (ack-grep) 中排除特定文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ack 搜索没有扩展名的内部文件

如何从重写器中排除特定文件

如何从 Serilog 中排除特定的异常类型?

如何使用 NodeJS 从列表中排除特定字符串

如何从 Swift 的扩展中排除特定的 UIButton?

从 Woocommerce 相关产品中排除特定产品类别