Kann nur Dateien durchsuchen, die einem bestimmten 'Glob'-Muster entsprechen (zB: Suche nach foo in allen Dateien mit dem Namen "bar * .c"). Der Befehl
ack foo "bar*.c"
Funktioniert nur im aktuellen Verzeichnis.
Hinweis: Ich weiß, dass es mit find -exec möglich ist:
find . -name "bar*.c" -type f -exec ack foo {} +
Ich hätte aber gerne einen kleinen und einfachen Befehl ack, da find keine Verzeichnisse zur Versionskontrolle überspringt.
find . -name "bar*.c" -exec ack foo {} \;
? Es gibt nichts Besonderesgrep
, Sie können jeden Befehl mit find's verwenden-exec
.Antworten:
Verzeichnisse durchsuchen
Basierend auf der in der Manpage gezeigten Übersicht würde ich sagen, dass es ein Verzeichnis verarbeiten kann, aber wenn man sich die Schalter ansieht, kann es nicht nur nach einer Datei suchen, die auf einem Muster basiert. Dafür musst du dich anmelden
find
. Der Befehlack
enthält die Option,--files-from=FILE
damit ihm eine Liste von Dateien zugeführt werden kannfind
.Zusammenfassung
Verwendungszweck
Es gibt die
--ignore-file=
Option, die Ihnen vielleicht das gibt, was Sie wollen, aber es scheint ein bisschen mühsam zu sein, sie tatsächlich zu nutzen.Durchsuchen bestimmter Dateitypen
Die einzige andere Möglichkeit, die ich mir vorstellen kann,
ack
ist die Verwendung des--type
Schalters:So sehen Sie, welche Typen verfügbar sind:
Format. Beispielsweise funktionieren sowohl --type = perl als auch --perl. - [no] cpp .cpp .cc .cxx .m .hpp .hh .h .hxx - [no] objcpp .mm .h - [no] perl .pl .pm .pod .t .psgi; Die erste Zeile entspricht /^#!.*\bperl/ - [no] perltest .t
Beispiele
Suchen Sie alle Perl-Dateien anhand des Dateinamens (* .pm, * .pl, * .t und * .pod) und der Shebang-Zeile.
Finden Sie alle C ++ - Dateien:
Suche nach foo in bar * .c
Wie können Sie dann erreichen, was Sie wollen? Nun, Sie müssen wahrscheinlich verwenden
find
, um dies zu tun:Sie können mit der Funktion von auch
ack
nach Dateien suchen, die mit einem bestimmten Muster in ihren Dateinamen übereinstimmen (mithilfe von-g <pattern>
), und diese Liste dann an einen zweiten Aufruf vonack
using-x
oder übergeben--files-from=-
.Verwenden von
-x
:Verwenden von
-files-from=-
:In beiden Fällen stimmen wir mit den Dateinamen überein, die Sie mit diesem regulären Ausdruck verwenden möchten:
Dies entspricht Dateien , dessen Namen
bar.*c
und das Ende nach der.c
das Ende der Linie Anker verwenden,$
. Wir achten auch darauf, dass die Namen mit einem Begrenzungszeichen versehen sind\b
. Dies schlägt für Dateien fehl, die Begrenzungszeichen wie$bar.c
oder enthalten%bar.c
.quelle
cpp
Dateien suchenack --type=cpp <string>
. Weitereack
Informationen hierzu finden Sie in der Manpage von. Aber ich sage Ihnen im Grunde, dass Sie nicht so suchen können,ack
wie Sie es möchten.ack
nicht tun kann, was gefragt wurde.find adir -iname "bar*.c" | ack --files-from=- foo
. Oder, wenn Sie nur eine Datei möchten:echo "barBaz.c" | ack --files-from=- foo
ack -g '\bbar.*.c$' | ack -x foo
Es ist einfach, wenn der Dateityp bekannt ist und ack viele Dateitypen kennt. Wenn Sie beispielsweise nur in C-Dateien suchen möchten, können Sie Folgendes tun:
Wenn es sich jedoch nicht um eine der bekannten Erweiterungen handelt, müssen Sie Ihren eigenen Typ definieren. Das sollte funktionieren:
Beachten Sie, dass Sie sowohl --type-set als auch --barc benötigen.
(Danke an Andy, der auch auf der Mailingliste mitgeholfen hat.)
quelle
man ack
hilft nicht wirklich und hat nicht,cc
wenn ich das suche."Was ist neu in ack 2?" http://beyondgrep.com/ack-2.0/
Nur ich kann es nicht zum Laufen bringen:
So scheint es, dass -g einen regulären Ausdruck benötigt, während ich eine 'glob'-Stiloption möchte ...
quelle
-g
braucht einen regulären Ausdruck, keinen Glob. Du könntest deinen regulären Ausdruck schreiben als.*bar.*\.c$
.Dies scheint am schnellsten und sichersten zu sein:
-x Liest die Liste der zu durchsuchenden Dateien in STDIN.
Wenn sich die Datei jedoch wahrscheinlich in Ihrer
locate
Datenbank befindet, ist dies noch schneller:Locate akzeptiert auch reguläre Ausdrücke der alten Schule, die etwas schmerzhaft sind. Wenn Sie jedoch nach
c
Dateien suchen , ist dies möglicherweise erforderlich. z.BDas bedeutet einfach: "Alle Dateinamen durchsuchen, die mit c, cpp, h, hpp oder cc enden."
quelle
Ack unterstützt keine globale Dateiauswahl. Da ich das wirklich vermisse, habe ich ein kleines Shell-Skript ackg erstellt :
Jetzt können Sie den Befehl verwenden:
Aber Achtung: Dies wird leider auch in Versionskontrollverzeichnissen (zB .git) gesucht.
quelle
Dies kann mit der
-G
Option ag geschehen , dem Silver Searcher (einem erweiterten Klon von ack-grep).Anmerkungen:
ag
verwendet die PCRE- Syntax für reguläre Ausdrücke, daher mussbar.*\.c
stattdessen der reguläre Ausdruck verwendet werdenbar*.c
.-G
Option muss vor dem Suchbegriff stehen, da alles, was danach folgt, als Dateiname interpretiert wird.quelle
Möchten Sie nur ein bestimmtes Muster oder nur C-Quelldateien?
Wenn Sie alle C-Dateien möchten, verwenden Sie
Wenn Sie alle C-Dateien und NICHT C-Header-Dateien verwenden möchten
quelle
Die Antwort von @chim ist die beste, aber sie wurde als Kommentar geschrieben. Ich poste sie also als formelle Antwort ...
Ich mag die Tatsache, dass Sie den Weg regexen können ...
quelle
Mit zsh können Sie:
quelle
ls
.