ack错过了结​​果(对比grep)

tec*_*ace 46 grep ack

我确定我对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$
Run Code Online (Sandbox Code Playgroud)

而...

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' } %>
Run Code Online (Sandbox Code Playgroud)

简单地在ack没有选项的情况下调用无法在.bak文件中找到结果,但使用该--unrestricted选项调用可以找到结果.据我所知,ack .bak默认不会忽略文件.

UPDATE

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

--type-add=ruby=.haml,.rake
--type-add=css=.less

Joa*_*uer 52

ack它的特殊之处在于它没有要忽略的文件类型的黑名单,而是它将搜索的文件类型的白名单.

引用手册页:

没有文件选择,ack-grep只搜索它识别的类型的文件.如果您有一个名为的文件foo.wango,并且ack-grep不知道.wango文件是什么,ack-grep则不会搜索它.

(注意我正在使用Ubuntu,ack-grep因为命名冲突而调用二进制文件)

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

  • 太好了,谢谢你的帮助!对于任何感兴趣的人,以下页面将为您提供有关向ack添加无法识别的文件类型(如.haml)的更多信息:http://wiki.github.com/protocool/ack-tmbundle/recognizing-files (3认同)
  • acty识别的文件类型不仅仅是扩展.它也将关注shebang线.如果你有一个以"#!/ usr/bin/perl"开头的程序"mywhatever",ack会知道它是一个Perl程序. (3认同)
  • 请注意,ack 2.0会更改此行为. (2认同)

And*_*ter 13

如果您对ack将要搜索的文件感到困惑,只需添加-f选项即可.它将列出它找到的可搜索的所有文件.


nev*_*219 12

ack --man 状态:

如果你想要ack搜索每个文件,即使它总是忽略像coredumps和备份文件,请使用"-u"开关.

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

这就是为什么ack不搜索它不能识别的东西的行为是它最大的优势之一:你只需搜索你想要看的东西就能获得的速度.

编辑:此外,如果您查看源代码,bak文件将被忽略.


Jon*_*ley 5

从1973年开始,您可以使用普通的旧grep,而不是与ack进行摔跤.因为它使用明确列入黑名单的文件,而不是白名单文件类型,因此它永远不会遗漏正确的结果.给定了几行配置(我在20世纪90年代在我的主目录'dotfiles'repo中创建),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 "$@"
}
Run Code Online (Sandbox Code Playgroud)

要忽略的文件和目录的确切列表可能会有所不同:我主要是Python开发人员,这些设置对我有用.

添加子自定义也很容易,正如我为我的'grpy'所示,我用来grep Python源代码.

定义像这样的bash函数比设置GREP_OPTIONS更好,这将导致来自登录shell的grep的所有执行行为不同,包括由您运行的程序调用的那些.这些程序可能会对grep的意外不同行为进行调查.

我的新功能'grp'和'grpy'故意不影响'grep',所以我仍然可以在任何需要的时候使用原始行为.

  • 并没有像称呼"大量浪费时间"那样具有煽动性(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/.如果您输入re:该页面,我欢迎它.我不认为这是一款游戏.我只想挥动除了grep之外还有选项的标志. (6认同)
  • 好吧,我放弃了,我觉得我说的那些意思很糟糕.但我之所以如此脾气暴躁的原因在于,上次我读到它时,'betterthangrep'主页用来列出类似"使用ack而不是grep的10个理由",这非常具有误导性,因为grep也做了许多事情在名单上.我看到这个名单现在标题为"使用ack的10个理由",这有点安抚,但我仍然知道那些误解为"grep不能做的事情"的人.关于"更多工具"页面,我给出的反馈是它可以包括grep作为替代,也许有几个...... (4认同)
  • 你是否有时间/倾向为betterthangrep.com写一些东西,我可以变成一个页面,或至少在"更多工具"页面上的一节?我喜欢列表的想法"如果你想坚持使用grep,这里有你可以使用的调整." 网站repo位于https://github.com/petdance/betterthangrep,您可以将其分叉,或将其置于问题中.或者哎呀,只要把我邮寄到andy-at-petdance.com,我就会接受.我可以使用你在上面评论中得到的内容,但我认为你可能会添加更多内容. (4认同)
  • 嘿安迪 我承认我夸大了喜剧效果的一点点,如果那是煽动性的,我道歉.但是我的方法直接受到了Ack自己的"优于grep"自我推销的启发,为了让grep看起来很糟糕,它无耻地歪曲并忽略了显着的细节.两个人可以参加那场比赛.如果'确认'真的更好,那么它应该有助于促进一个诚实的比较,而不是通过让人们放弃像grep这样完美的替代品而使用虚假陈述来破坏社区. (2认同)
  • ...行建议如何在.bashrc中配置包装函数来设置一些默认值,例如"-rI --color --exclude-dir =\.git --exclude = tags".当你提出像"ack很快"这样的声明时,或许值得一提的是,正确配置为跳过相同的文件,grep(上次我测量它)实际上更快.谢谢你的合理,即使我是如此卑鄙. (2认同)