ack rekursiert nicht, wenn ein Dateimuster angegeben wird

3
ack "#define" 

wird in Unterverzeichnisse rekursiv und findet Dateien, die #define enthalten. Aber ich wollte die Suche auf * .h-Dateien beschränken, also habe ich es versucht

ack "#define" *.h

und es kehrt nicht mehr zurück. Die einzigen Ergebnisse stammen aus Dateien im Arbeitsverzeichnis.

Ausführung:

ack 1.96 Läuft unter Perl 5.14.2 unter / usr / bin / perl

Sashang
quelle
Siehe auch dieses , dieses , dieses , ...
Grawity

Antworten:

4

Der Platzhalter *.hwird von Ihrer Shell erweitert , und ack empfängt nur einzelne Dateien als Argumente - es gibt keine Möglichkeit, darauf zurückzugreifen.

Um dies zu vermeiden, geben Sie den Platzhalter innerhalb einfache oder doppelte Anführungszeichen, aber ack wird wahrscheinlich nicht erkennen es als Platzhalter: ack "#define" "*.h".

Eine bessere Option besteht darin --hh, nur Header-Dateien einzuschließen (siehe --help type) oder -G '\.h$'nur Dateien einzuschließen, die dem angegebenen Perl-Regex entsprechen.

Grawity
quelle
1
In ack2 können Sie anstelle von -G (das entfernt wurde) Folgendes tun: ack -g '\ .h $' | ack -x '#define'
jondro