Durchsuche ALLE Dateien mit ack


14

Wie kann ich mit v2 alle Dateien (einschließlich Binärdateien) im aktuellen Verzeichnis durchsuchen ack?

Ich möchte das Gleiche tun ack 'foo' **, aber nur mit einem Flag, also funktioniert es, wenn ich alle Dateien in einem bestimmten Verzeichnis durchsuchen möchte, ohne sie anzuhängen **.


Unterschied zwischen ack 'foo'und ack 'foo' **:

$ mkdir test && cd test
$ printf '\x00\x01foo1\x00' > test1
$ printf 'foo2' > test2
$ ack 'foo'
test2
1:foo2
$ ack 'foo' **
test1
1:foo1

test2
1:foo2

Warum möchten Sie ack anstelle von grep verwenden?
Andy Lester

1
@AndyLester Ich dachte nur, das ackist immer besser als grep. Ich hab mich geirrt :).
Tyilo

Antworten:


6

Standardmäßig sucht Ack in allen nicht-binären Dateien unterhalb des aktuellen Verzeichnisses nach einem Muster.

Ich glaube, ältere Ack-Versionen würden Binärdateien durchsuchen, wenn Sie ihnen das --binaryFlag übergeben. Diese Flagge wurde jedoch entfernt. Möglicherweise können Sie stattdessen grep verwenden.

grep -ar 'foo' .

Es hat nichts mit Symlinks zu tun. Es hat mit Binärdateien zu tun!
Tyilo

@ Tyilo: Ich habe meine Antwort geändert.

13

Wenn Sie ack keinen Dateinamen übergeben, wird ein integrierter Standardsatz von Dateien verarbeitet, der nicht erkannte Binärdateien ausschließt. Wenn Sie Dateinamen übergeben, werden alle übergebenen Dateien durchsucht. Dies erklärt den Unterschied zwischen ack foound ack foo **.

ack 1

Verwenden Sie in ack 1.x das Flag -a, um ack anzuweisen, keine Dateien zu überspringen, deren Typ nicht erkannt wird.

Sie können einen Alias ​​erstellen, wenn Sie dieses Flag häufiger als gewünscht verwenden möchten: Fügen Sie die Zeile alias ack='ack -a'in Ihr ~/.bashrcoder ein ~/.zshrc. Wenn Sie diesen Alias ​​einrichten und ackohne die Option aufrufen möchten , rufen Sie auf \ack(der umgekehrte Schrägstrich deaktiviert die Aliaserweiterung). Skripte sind nicht vom Alias ​​betroffen, sondern nur interaktive Shells.

Alternativ können Sie die -aOption zu Ihrer hinzufügen ~/.ackrc.

Übereinstimmungen in Binärdateien werden als "Übereinstimmungen mit Binärdatei test1" aufgeführt. Es gibt keine Möglichkeit, dieses Verhalten zu deaktivieren, ohne Ack selbst zu ändern (zumindest ein Plugin hinzuzufügen).

ack 2

In ack 2.0 wurde die -aOption entfernt. Sie können stattdessen einen Typ definieren, der allen Dateien entspricht, und die -kOption verwenden, um sicherzustellen, dass alle Dateien dieses Typs mit einbezogen werden. Beachten Sie, dass Dateitypen in einer unvorhersehbaren Reihenfolge verarbeitet werden. Dies führt dazu, dass eine zufällige Menge von Binärtypen wie gewohnt und nicht wie gewohnt verarbeitet wird.

ack --type-set='all:match:.*' -k foo

Auf diese Weise werden die Übereinstimmungen auch für Dateien gedruckt, die ansonsten binär aussehen würden. Wie oben können Sie diese Optionen zu einem Alias ​​oder zu Ihrem hinzufügen .ackrc.


1
Das ist ziemlich hinterhältig, @Gilles.
Andy Lester

@AndyLester, warum wurde die Option -a entfernt? Das "Das liegt daran" in der Rückgabe erklärt nicht, warum ich nicht mehr nach unbekannten Dateitypen suchen kann.
Yann Dìnendal

Da das Verhalten von 1.x -a zum Durchsuchen aller nicht erkannten Textdateien jetzt der Standard in 2.0 ist.
Andy Lester

2
Komisch, ich habe eine verkleinerte js-Datei, die selbst dieses spezielle Match-All-Types-Typ-Set nicht finden kann ...
Izkata

Ich bin deswegen hier: ein Text in einer minimierten js-Datei, der nicht von ack analysiert wird. Ich dachte, die Antwort wäre "add -a" ... ich bin enttäuscht.
Luciano Fantuzzi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.