ack未命中结果(vs grep)

我确定我误解了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文件中find结果,但使用--unrestricted选项调用可以find结果。 据我所知,尽pipeack默认不会忽略.bak文件。

UPDATE

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

 --type加=ruby= .haml,.rake
 --type加= CSS = .LESS

ack的特殊之处在于,它没有要忽略的文件types的黑名单,而是将要search的文件types的白名单。

引用从手册页:

没有文件select, ack-grep只search它识别的文件types。 如果你有一个名为foo.wango的文件,并且ack-grep不知道.wango文件是什么,那么ack-grep将不会search它。

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

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

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

ack --man说:

如果你想要search每一个文件,即使是那些一直忽略的文件,如coredumps和备份文件,使用“-u”开关。

为什么ack默认忽略未知文件? ack是由程序员为程序员devise的,用于search大量的代码树。 大多数代码库都有很多文件,它们不是源文件(如编译目标文件,源代码控制元数据等),而且grep浪费大量时间search所有这些文件,并从这些文件中返回匹配项。

这就是为什么ack不search它不认识的东西的行为是它最大的优势之一:你只从search你想要查看的东西中获得的速度。

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

而不是摔跤,你可以使用普通的老grep,从1973年。因为它使用明确列入黑名单的文件,而不是白名单的文件types,永远不会遗漏正确的结果。 考虑到几行configuration(我在20世纪90年代在我的主目录'dotfiles'repo中创build的),grep实际上匹配或超过了许多ack的优势 – 特别是速度:当search同一组文件时,grep比ack快。

使我快乐的grepconfiguration看起来像这样,在我的.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要好,这会导致你的loginshell执行的grep的所有执行行为都不一样,包括那些你运行的程序所调用的行为。 这些程序可能会对grep的意外的不同行为进行攻击。

我的新function“grp”和“grpy”故意不影响“grep”,这样我就可以在任何需要的时候使用原来的行为。