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 Befehl ackenthält die Option, --files-from=FILEdamit ihm eine Liste von Dateien zugeführt werden kann find.
Zusammenfassung
ack [options] PATTERN [FILE...]
ack -f [options] [DIRECTORY...]
Verwendungszweck
--files-from=FILE
The list of files to be searched is specified in FILE. The list of
files are separated by newlines. If FILE is "-", the list is
loaded from standard input.
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.
--ignore-file=FILTERTYPE:FILTERARGS
Ignore files matching FILTERTYPE:FILTERARGS. The filters are
specified identically to file type filters as seen in "Defining
your own types".
Durchsuchen bestimmter Dateitypen
Die einzige andere Möglichkeit, die ich mir vorstellen kann, ackist die Verwendung des --typeSchalters:
--type=[no]TYPE
Specify the types of files to include or exclude from a search.
TYPE is a filetype, like perl or xml. --type=perl can also be
specified as --perl, and --type=noperl can be done as --noperl.
If a file is of both type "foo" and "bar", specifying --foo and
--nobar will exclude the file, because an exclusion takes
precedence over an inclusion.
So sehen Sie, welche Typen verfügbar sind:
$ ack --help-types | grep -E "perl|cpp"
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.
$ ack -f --type perl
examples/iwatch/iwatch/iwatch
examples/nytprof_perl/bad.pl
Finden Sie alle C ++ - Dateien:
$ ack -f --type=cpp
Shared/Scanner.h
Shared/Sorter.h
Shared/DicomHelper.cpp
Shared/DicomDeviationWriter.h
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:
$ find adir -iname "bar*.c" | ack --files-from=- foo
adir/bar1.c
1:foo
2:foo
adir/dir1/bar1.c
1:foo
2:foo
Sie können mit der Funktion von auch acknach Dateien suchen, die mit einem bestimmten Muster in ihren Dateinamen übereinstimmen (mithilfe von -g <pattern>), und diese Liste dann an einen zweiten Aufruf von ackusing -xoder übergeben --files-from=-.
Verwenden von -x:
$ ack -g '\bbar.*.c$' | ack -x foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
Verwenden von -files-from=-:
$ ack -g '\bbar.*.c$' | ack --files-from=- foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
In beiden Fällen stimmen wir mit den Dateinamen überein, die Sie mit diesem regulären Ausdruck verwenden möchten:
\bbar.*.c$
Dies entspricht Dateien , dessen Namen bar.*cund das Ende nach der .cdas 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.coder enthalten %bar.c.
find . -name "bar*.c" -exec ack foo {} \;? Es gibt nichts Besonderesgrep, Sie können jeden Befehl mit find's verwenden-exec.