2010-06-14 45 views
44

我敢肯定,我誤解一些關於ACK的文件/目錄忽略默認值,但也許有人可以提供一些線索這對我來說:ACK失誤的結果(與grep的)

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文件。

UPDATE

由於下面的有益的意見,這裏有我的~/.ackrc新內容:

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

回答

51

ack的特別之處在於它沒有文件類型到黑名單忽略,而是文件類型的白名單,它搜索英寸

要引用從手冊頁:

沒有文件選擇,ack-grep只搜索它識別的文件類型。如果您有一個名爲foo.wango的文件,並且ack-grep不知道.wango文件是什麼,ack-grep將不會搜索它。

(請注意,我使用的Ubuntu在二進制被稱爲ack-grep由於命名衝突)

ack --help-types會顯示您的ACK安裝支持類型的列表。

+2

非常感謝您的幫助!對於任何感興趣的人,下面的頁面會給你更多關於添加無法識別的文件類型(如.haml)到ack的信息:http://wiki.github.com/protocool/ack-tmbundle/recognizing-files – techpeace 2010-06-14 17:36:39

+3

文件類型確認不僅僅是擴展。它也會看到shebang線。如果你有一個啓動「#!/ usr/bin/perl」的程序「mywhatever」,ack會知道它是一個Perl程序。 – 2010-06-15 22:39:01

+2

請注意,ack 2.0會更改此行爲。 – 2013-05-03 21:07:09

12

ack --man狀態:

如果你想ACK搜索每一個文件, 甚至是那些總是忽略像 核心轉儲文件和備份文件,使用 「-u」開關。

爲什麼ACK由 默認忽略未知的文件? ack由 程序員爲程序員設計, 爲搜索大型代碼樹而設計。大多數 代碼庫在他們 了很多文件,這不是源文件(如 編譯的對象文件,源代碼控制 元數據等),和grep浪費了很多的時間 通過所有這些 的搜索以及和返回比賽從 這些文件。

這就是爲什麼不 搜索的東西ACK的行爲不承認 是其最大的優勢之一: 速度,你只從搜索你想要的東西 去尋找的。

編輯:另外,如果你看源代碼,bak文件被忽略。

+1

有趣,謝謝!沒有意識到他們在.bak中忽略了硬編碼。 – techpeace 2010-06-14 17:36:02

+1

ack專門針對「在源代碼樹中查找代碼」的常見情況進行了優化。在這種常見情況下,你想忽略.bak文件。它不是一個通用的搜索工具,儘管你可以做到這一點,如果你跳過籃球。如果你需要一個通用工具,最好簡單地使用grep。 – 2010-06-14 19:23:43

+1

'-u'在ack版本2中不可用。 – 2015-01-08 22:14:44

13

如果您對將要搜索的文件感到困惑,只需添加-f選項即可。它將列出它發現可搜索的所有文件。

+1

這非常方便,以及...謝謝! – techpeace 2010-06-15 16:26:42

+1

爲了澄清,您必須自己輸入'ack -f'而不用其他參數。 – 2014-03-04 15:32:06

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 "[email protected]" 
} 

function grpy { 
    grp --include=*.py "[email protected]" 
} 

文件和目錄忽略的確切名單可能會對你有所不同:我主要是一個Python開發和這些設置適用於我。

也可以很容易地添加子定製,就像我爲我的'grpy'所展示的那樣,我使用grep Python源代碼。

像這樣定義bash函數優於設置GREP_OPTIONS,這會導致您的登錄shell中所有grep執行的行爲都不同,包括那些由您運行的程序調用的行爲。這些程序可能會禁止grep的意外不同行爲。

我的新功能'grp'和'grpy'故意不會影響'grep',這樣我就可以在任何需要的時候使用原始行爲。

+1

Arf。剛纔我發現,如果你將上面的兩行腳本重命名爲'ack',它可能會構成對ack項目源代碼的下一個提交。 – 2011-10-04 11:11:53

+0

你的兩行腳本不處理用於檢測文件類型的shebang行,它也不利用Perl的正則表達式引擎和--output標誌,也不會在'-1'等一次命中時停止,等等。您可能不會使用這些功能,但手動「這個grep腳本與ack相同」是不公平的,因爲它們不是。 – 2012-06-05 16:59:44

+2

嘿安迪。我承認我誇大了喜劇效果的一小部分,我很抱歉,如果這是煽動性的。但是我的方法直接受到Ack自己的「比grep更好」的自我推銷的啓發,它無恥地歪曲和忽略了顯着的細節,使grep看起來很糟糕。兩人可以在那場比賽中踢球。如果'ack'確實比較好,那麼它應該有助於促進一個誠實的比較,而不是使用虛假陳述來破壞社區,使人們放棄像grep這樣的完美選擇。 – 2012-06-06 14:21:49