我确定我对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
答案 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',所以我仍然可以在任何需要的时候使用原始行为。