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

时间:2010-06-14 16:29:25

标签: 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$

...而

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 个答案:

答案 0 :(得分:52)

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

引用手册页:

  

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

(请注意,由于命名冲突,我使用的是Ubuntu,其中二进制文件称为ack-grep

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

答案 1 :(得分:13)

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

答案 2 :(得分:12)

ack --man州:

  

如果你想让ack搜索每个文件,   即使是那些一直无视的东西   coredumps和备份文件,使用   “-u”开关。

  

为什么ack会忽略未知文件   默认? ack是由a设计的   程序员,程序员,   搜索大树的代码。最   代码库中有很多文件   这些不是源文件(如   编译对象文件,源代码控制   元数据等),grep浪费了很多   搜索所有这些的时间   以及来自的回归比赛   那些文件。

     

这就是为什么ack的行为不是   搜索它无法识别的东西   是其最大的优势之一:   你只从搜索中得到的速度   你想要看的东西。

编辑:另外,如果查看源代码,bak文件将被忽略。

答案 3 :(得分:5)

从1973年开始,你可以使用普通的旧grep而不是与ack进行摔跤。因为它使用明确列入黑名单的文件,而不是白名单文件类型,它永远不会遗漏正确的结果。给定了几行配置(我在20世纪90年代在我的主目录'dotfiles'回购中创建),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'所展示的那样,我用来grep Python源代码。

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

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