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 ack
enthält die Option, --files-from=FILE
damit 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, ack
ist die Verwendung des --type
Schalters:
--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 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 von ack
using -x
oder ü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.*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
.
find . -name "bar*.c" -exec ack foo {} \;
? Es gibt nichts Besonderesgrep
, Sie können jeden Befehl mit find's verwenden-exec
.