ack 错过了结果(与 grep 相比)

46

我肯定对ack的文件/目录忽略默认设置有什么误解,但也许有人可以为我解释一下:

mbuck$ grep logout -R app/views/
Binary file app/views/shared/._header.html.erb.bak.swp matches
Binary file app/views/shared/._header.html.erb.swp matches
app/views/shared/_header.html.erb.bak: <%= link_to logout_text, logout_path, { :title => logout_text, :class => 'login-menuitem' } %>
mbuck$ ack logout app/views/
mbuck$

相比于使用多个布尔运算符,使用逻辑运算符 &&|| 更加简洁和易读。

mbuck$ ack -u logout app/views/
Binary file app/views/shared/._header.html.erb.bak.swp matches
Binary file app/views/shared/._header.html.erb.swp matches
app/views/shared/_header.html.erb.bak
98:<%= link_to logout_text, logout_path, { :title => logout_text, :class => 'login-menuitem' } %>

如果不使用选项调用 ack ,则无法在 .bak 文件中找到结果,但是使用 --unrestricted 选项可以找到结果。据我所知,ack 默认情况下不会忽略 .bak 文件。

更新

感谢下面的有用评论,这是我的 ~/.ackrc 的新内容:

--type-add=ruby=.haml,.rake
--type-add=css=.less
4个回答

52

ack的特殊之处在于它没有要忽略的文件类型黑名单,而是有一个文件类型白名单,它会在这些文件类型中搜索。

引用手册上的一句话:

如果没有文件选择,ack-grep只搜索它能够识别的文件类型。如果你有一个名为foo.wango的文件,而ack-grep不知道.wango文件是什么,那么ack-grep就不会搜索它。

(注意我在使用Ubuntu,由于命名冲突,二进制文件叫做ack-grep)

ack --help-types将显示您的ack安装支持的文件类型列表。


3
太好了,感谢你的帮助!如果有人感兴趣,以下页面将为您提供有关如何将未被识别的文件类型(例如.haml)添加到ack中的更多信息:http://wiki.github.com/protocool/ack-tmbundle/recognizing-files。 - techpeace
3
ack 可识别的文件类型不仅限于扩展名,它还会查看 shebang 行。如果你有一个以 "#!/usr/bin/perl" 开头的程序 "mywhatever",ack 将知道它是一个 Perl 程序。请注意,此处的翻译是通俗易懂的,但并非逐字翻译。 - Andy Lester
3
请注意,ack 2.0 更改了此行为。 - Andy Lester

13

如果您对ack将要搜索哪些文件感到困惑,只需添加-f选项即可。它会列出所有被认为是可搜索的文件。


1
请注意,您必须单独键入ack -f,不要带任何其他参数。 - Will Sheppard

12

ack --man的文档描述如下:

如果您想让ack搜索所有文件,即使是它始终忽略的文件(例如coredumps和备份文件),请使用“−u”开关。

另外:

为什么ack默认情况下忽略未知文件?ack是由程序员为程序员设计的,用于搜索大量代码树。大多数代码库中有许多文件不是源文件(例如已编译的对象文件、源代码控制元数据等),grep在这些文件中搜索并从这些文件返回匹配项需要浪费很多时间。

这就是ack的行为不搜索它不认识的东西的原因之一:只搜索您想查看的内容,这样可以获得速度优势。

编辑:此外,如果您查看源代码,则会忽略文件。


1
有趣,谢谢!我没意识到他们已经硬编码了.bak忽略。 - techpeace
1
ack 是专门针对“在源代码树中查找代码”的常见情况进行优化的。在这种常见情况下,您希望忽略 .bak 文件。它并不是一个通用的搜索工具,尽管您可以通过跳过一些步骤来将其变成通用工具。如果您需要一个通用工具,最好直接使用 grep。 - Andy Lester
1
在ack版本2中,-u不可用。 - Joshua Goldberg

5

与其费尽心思去使用 ack,不如使用可追溯至 1973 年的老派 grep。由于它使用明确列出被禁止的文件,而不是白名单文件类型,因此它永远不会省略正确的结果。只需要几行配置(我在上世纪九十年代创建了它,放在我的家目录“点文件”仓库中),grep 实际上可以匹配或超越许多 ack 声称的优势,特别是速度:当搜索相同的一组文件时,grep 比 ack 更快。

让我满意的 grep 配置如下,在我的 .bashrc 文件中:

# Custom 'grep' behaviour
# Search recursively
# Ignore binary files
# Output in pretty colors
# Exclude a bunch of files and directories by name
# (this both prevents false positives, and speeds it up)
function grp {
    grep -rI --color --exclude-dir=node_modules --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude-dir=.tox --exclude=tags "$@"
}

function grpy {
    grp --include=*.py "$@"
}

忽略的文件和目录的确切列表可能与您不同:我主要是Python开发人员,这些设置适合我。

添加子自定义也很容易,就像我展示的我的“grpy”一样,我用它来搜索Python源代码。

定义bash函数比设置GREP_OPTIONS更可取,后者会导致从登录shell运行的所有grep执行行为不同,包括您运行的程序调用的那些。那些程序可能会在grep的意外不同行为上崩溃。

我的新功能“grp”和“grpy”故意不隐藏“grep”,以便我随时可以使用原始行为。


2
嘿,安迪。我承认我有点夸张,只是为了搞笑效果,如果这引起了不良反应,我很抱歉。但我的方法直接受到Ack自己的“比grep更好”的自我推销启发,这种行为无耻地歪曲和省略重要细节,以便让grep看起来很糟糕。两个人都可以玩这个游戏。如果'ack'真的更好,那么它应该帮助促进诚实的比较,而不是使用歪曲来分裂社区,导致人们放弃像grep这样完全可行的替代方案。 - Jonathan Hartley
6
不如称ack为“浪费时间的巨大工具”那么具有煽动性。(http://daniel.hahler.de/ack-grep-a-source-aware-grep-replacement-searching-for-content-in-files)我没有“歪曲事实”,也没有让grep看起来不好。 如果我的确有这样做,请指出来,以便我进行修正。 我希望人们使用最好的工具。在许多情况下,包括在SO上,我都告诉人们“不要在此情况下使用ack,而要使用grep。”我支持比较:http://betterthangrep.com/more-tools/。如果您对该页面有任何意见,请提出。我不认为这是一场游戏。我只是想宣传除grep之外的其他选项。 - Andy Lester
4
好的,我明白了。以下是翻译的内容:好吧,我认输了,我为我说的那些恶毒的话感到难过。但是我脾气暴躁的原因是,上次我读到“betterthangrep”主页列出了类似“使用ack而不是grep的10个理由”的东西,这非常具有误导性,因为grep也可以完成列表上的许多任务。我看到该列表现在的标题是“使用ack的10个理由”,这有点平息了我的怒气,但我仍然知道有人会误解它的意思是“grep无法实现的事情”。关于“更多工具”页面,我想提供的反馈是,它可以包括grep作为另一种选择,也许附带一些... - Jonathan Hartley
2
以下是如何在.bashrc中配置包装函数以设置一些默认值的建议,例如“-rI --color --exclude-dir=.git --exclude=tags”。当你声称“ack很快”时,也许值得在某个地方提到,经过适当配置以跳过相同的文件,grep(上次我测量时)实际上更快。感谢您的合理性,即使我很刻薄。 - Jonathan Hartley
4
你是否有时间和意愿为betterthangrep.com写些东西,我可以把它变成一个页面,或者至少是“更多工具”页面的一部分? 我喜欢列出“如果你想继续使用grep,这里有一些调整建议”的想法。 网站存储库位于https://github.com/petdance/betterthangrep,你可以fork它,或将其放入问题中。 或者你可以发送电子邮件到andy-at-petdance.com,我会处理的。我可以使用你上面的评论,但我认为你可能会添加更多内容。 - Andy Lester
显示剩余6条评论

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