2010-06-14 6 views
44

Ich bin sicher, dass ich etwas über ack der Datei/Verzeichnis ignorieren defaults bin Missverständnis, aber vielleicht könnte jemand etwas Licht in diese für mich vergossen:ack Misses Ergebnisse (vs. 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$ 

Während .. .

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' } %> 

einfach ack ohne Optionen aufrufen nicht finden können, das Ergebnis innerhalb einer .bak Datei, aber mit der Option --unrestricted Aufruf kann das Ergebnis finden. Soweit ich das beurteilen kann, ignoriert ack die .bak Dateien standardmäßig nicht.

UPDATE

Dank der hilfreichen Kommentare unten, hier sind die neuen Inhalte meiner ~/.ackrc:

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

Antwort

51

ack eigentümlich ist, dass es nicht eine schwarze Liste von Dateitypen muss ignorieren, sondern eher eine Whitelist von Dateitypen, die es wird Suche in.

Um von der man-Seite zu zitieren:

Ohne Dateiauswahl durchsucht ack-grep nur Dateien von Typen, die es erkennt. Wenn Sie eine Datei namens foo.wango haben und ack-grep nicht wissen, was eine .wango-Datei ist, wird ack-grep nicht suchen.

(Beachten Sie, dass ich Ubuntu bin mit dem die binären ack-grep aufgrund eines Namenskonflikt genannt wird)

ack --help-types wird eine Liste von Typen Ihrer ack-Installation unterstützt zeigen.

+2

Großartig, danke für die Hilfe! Für jeden, der interessiert ist, gibt die folgende Seite ein bisschen mehr Informationen über das Hinzufügen von unbekannten Dateitypen (wie .haml) zu ack: http://wiki.github.com/protocool/ack-tmbundle/recognosing-files – techpeace

+3

Die Dateitypen ack erkennt sind nicht nur Erweiterungen. Es wird auch Shebang-Linien betrachten. Wenn Sie ein Programm "mywhatever" haben, das "#!/Usr/bin/perl" startet, weiß ack, dass es ein Perl-Programm ist. –

+2

Beachten Sie, dass ack 2.0 dieses Verhalten ändert. –

12

ack --man Zustände:

Wenn Sie ack jede Datei, suchen auch diejenigen, die es ignoriert immer wie coredumps und Backup-Dateien, verwenden Sie die "-u" -Schalter.

und

Warum ignorieren ack unbekannte Dateien von default? ack wird von einem Programmierer, für Programmierer, für große Bäume des Codes suchen. Die meisten Codebases haben eine Menge von Dateien in ihnen , die nicht Quelldateien sind (wie kompilierten Objektdateien, die Quellcodeverwaltung Metadaten, etc.), und grep verschwendet viel Zeit durch all die Suche auch und wiederkehrende Streichhölzer von diese Dateien.

, deshalb, Verhalten ack von nicht Such Dinge, die es nicht erkennt ist eine seiner größten Stärken: die Geschwindigkeit, die Sie von nur bekommen suchen die Dinge, die Sie werden möchten, suchen.

BEARBEITEN: Auch wenn Sie den Quellcode betrachten, werden bak Dateien ignoriert.

+1

Interessant, danke! Realisierte nicht, dass sie in der .bak-Ignorierung fest programmiert hatten. – techpeace

+1

ack ist speziell für den häufigen Fall "Code in einem Baum des Quellcodes finden" optimiert. In diesem allgemeinen Fall möchten Sie .bak-Dateien ignorieren. Es ist NICHT dazu gedacht, ein universelles Suchwerkzeug zu sein, obwohl Sie es schaffen können, wenn Sie durch die Reifen springen. Besser, einfach grep zu verwenden, wenn Sie ein allgemeines Werkzeug benötigen. –

+1

'-u' ist nicht in der Ack Version 2 verfügbar. –

13

Wenn Sie jemals darüber verwirrt sind, welche Dateien ack suchen wird, fügen Sie einfach die Option -f hinzu. Es listet alle gefundenen Dateien auf, die durchsucht werden können.

+1

Das ist auch sehr praktisch, danke! – techpeace

+1

Um dies zu verdeutlichen, müssen Sie 'ack -f' ohne weitere Argumente eingeben. –

5

Anstatt mit ack zu ringen, könnte man einfach plain old grep aus dem Jahr 1973 verwenden. Da es explizit Blacklisted-Dateien anstelle von Whitelist-Dateitypen verwendet, werden niemals korrekte Ergebnisse ausgelassen. Mit einigen config-Zeilen (die ich in meinem home-Verzeichnis 'dotfiles' Repo in den 1990er Jahren erstellt habe), entspricht oder übertrifft grep tatsächlich viele der von ack behaupteten Vorteile - insbesondere die Geschwindigkeit: Bei der Suche nach dem gleichen Satz von Dateien, grep ist schneller als ack.

Die grep Config, die mich glücklich wie folgt aussieht, in meinem .bashrc macht:

# 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]" 
} 

Die genaue Liste der Dateien und Verzeichnisse zu ignorieren wahrscheinlich unterscheiden sich für Sie: dev Ich bin meistens ein Python und Diese Einstellungen funktionieren für mich.

Es ist auch einfach, Unteranpassungen hinzuzufügen, wie ich für meine 'grpy' zeige, die ich benutze, um Python-Quelle zu grepsen.

Das Definieren von bash-Funktionen wie diesem ist dem Setzen von GREP_OPTIONS vorzuziehen, was dazu führt, dass sich ALLE Ausführungen von grep von Ihrer Login-Shell anders verhalten, einschließlich derjenigen, die von Programmen ausgeführt werden. Diese Programme werden wahrscheinlich das unerwartet unterschiedliche Verhalten von grep beeinträchtigen.

Meine neuen Funktionen, 'grp' und 'grpy', werfen absichtlich keinen 'grep' auf, damit ich immer noch das ursprüngliche Verhalten verwenden kann, wenn ich das brauche.

+1

Arf. Es ist mir gerade eingefallen, dass, wenn Sie mein zweizeiliges Skript oben als "ack" umbenennen, es das nächste Commit für die Quelle des ack-Projekts bilden könnte. –

+0

Ihr zweizeiliges Skript behandelt keine Shebang-Zeilen zur Erkennung von Dateitypen, nutzt auch nicht die Perl-Engine für reguläre Ausdrücke und das --output-Flag, noch stoppt es bei einem Treffer mit "-1" usw. Du magst diese Funktionen nicht benutzen, aber es ist nicht fair zu handwave "Dieses Grep-Skript ist dasselbe wie Ack", weil es nicht so ist. –

+2

Hey Andy. Ich gestehe, ich übertreibe eine Kleinigkeit für den Effekt der Komödie, und ich entschuldige mich, wenn das entzündlich ist. Aber meine Herangehensweise wurde direkt von Ack's eigener "besser als grep" Eigenwerbung inspiriert, die schamlos auffällige Details verfälscht und weglässt, um grep schlecht aussehen zu lassen. Zwei können bei diesem Spiel spielen. Wenn 'ack' wirklich besser ist, dann sollte es hilfreich sein, einen ehrlichen Vergleich zu fördern, anstatt falsche Darstellungen zu verwenden, um Gemeinschaften zu fragmentieren, indem man Leute dazu bringt, vollkommen gute Alternativen wie grep zu verlassen. –