如何从 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) 中排除特定文件?的主要内容,如果未能解决你的问题,请参考以下文章