Wyszukiwanie katalogów
Na podstawie streszczenia pokazanego na stronie podręcznika powiedziałbym, że tak, może przetworzyć katalog, ale patrząc na przełączniki, nie może poszukać tylko pliku opartego na wzorcu. W tym celu musisz się zaciągnąć find
. Polecenie ack
zawiera opcję, --files-from=FILE
dzięki czemu można podać listę plików z find
.
streszczenie
ack [options] PATTERN [FILE...]
ack -f [options] [DIRECTORY...]
stosowanie
--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.
Istnieje --ignore-file=
opcja, która może dać ci to, czego chcesz, ale wydaje się trochę trudna w użyciu.
--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".
Wyszukiwanie określonych typów plików
Jedynym innym sposobem, w jaki mogę to zrobić, ack
jest użycie jego --type
przełącznika:
--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.
Aby zobaczyć, jakie typy są dostępne:
$ ack --help-types | grep -E "perl|cpp"
format. Na przykład działają zarówno --type = perl, jak i --perl. - [no] cpp .cpp .cc .cxx .m .hpp .hh .h .hxx - [no] objcpp .mm .h - [no] perl .pl .pm .pod .t .psgi; dopasowanie do pierwszego wiersza /^#!.*\bperl/ - [no] perltest .t
Przykłady
Znajdź wszystkie pliki Perla na podstawie nazwy pliku (* .pm, * .pl, * .t i * .pod) oraz linii shebang.
$ ack -f --type perl
examples/iwatch/iwatch/iwatch
examples/nytprof_perl/bad.pl
Znajdź wszystkie pliki C ++:
$ ack -f --type=cpp
Shared/Scanner.h
Shared/Sorter.h
Shared/DicomHelper.cpp
Shared/DicomDeviationWriter.h
Wyszukiwanie foo w barze * .c
Więc jak możesz osiągnąć to, czego chcesz? Cóż, prawdopodobnie będziesz musiał find
to zrobić:
$ find adir -iname "bar*.c" | ack --files-from=- foo
adir/bar1.c
1:foo
2:foo
adir/dir1/bar1.c
1:foo
2:foo
Możesz także skorzystać ack
ze zdolności wyszukiwania plików, które pasują do danego wzorca w nazwach plików (using -g <pattern>
), a następnie przekaż tę listę do drugiego wywołania ack
using -x
lub --files-from=-
…
Używanie -x
:
$ ack -g '\bbar.*.c$' | ack -x foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
Używanie -files-from=-
:
$ ack -g '\bbar.*.c$' | ack --files-from=- foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
W obu przypadkach dopasowujemy nazwy plików, których chcesz użyć za pomocą tego wyrażenia regularnego:
\bbar.*.c$
Dopasowuje pliki, których nazwa jest bar.*c
i koniec po .c
użyciu końcu linii kotwicy $
. Staramy się również upewnić, że nazwy mają znak graniczny przy użyciu \b
. Nie powiedzie się to dla plików zawierających znaki graniczne, takie jak $bar.c
lub %bar.c
na przykład.
find . -name "bar*.c" -exec ack foo {} \;
? Nie ma w tym nic specjalnegogrep
, możesz użyć dowolnego polecenia z find's-exec
.