Поиск в каталогах
Основываясь на кратком описании, показанном на странице руководства, я бы сказал, что он может обрабатывать каталог, но, глядя на переключатели, он не может искать только файл, основанный на шаблоне. Для этого вам придется заручиться find
. Команда ack
включает параметр, --files-from=FILE
чтобы можно было получать список файлов из find
.
конспект
ack [options] PATTERN [FILE...]
ack -f [options] [DIRECTORY...]
использование
--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.
Есть --ignore-file=
вариант, который может дать вам то, что вы хотите, но на самом деле кажется немного трудным для использования.
--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".
Поиск определенных типов файлов
Единственный другой способ, которым я могу представить, ack
- это использовать его --type
переключатель:
--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.
Чтобы увидеть, какие типы доступны:
$ ack --help-types | grep -E "perl|cpp"
формат. Например, оба --type = perl и --perl работают. - [нет] cpp .cpp .cc .cxx .m .hpp .hh .h .hxx - [нет] objcpp .mm .h - [нет] perl .pl .pm .pod .t .psgi; первая строка соответствует /^#!.*\bperl/ - [нет] perltest .t
Примеры
Найдите все файлы Perl на основе имени файла (* .pm, * .pl, * .t и * .pod) и строки shebang.
$ ack -f --type perl
examples/iwatch/iwatch/iwatch
examples/nytprof_perl/bad.pl
Найдите все файлы C ++:
$ ack -f --type=cpp
Shared/Scanner.h
Shared/Sorter.h
Shared/DicomHelper.cpp
Shared/DicomDeviationWriter.h
Поиск foo в баре * .c
Итак, как же вы можете достичь того, что вы хотите? Ну, вам, вероятно, придется использовать find
это:
$ find adir -iname "bar*.c" | ack --files-from=- foo
adir/bar1.c
1:foo
2:foo
adir/dir1/bar1.c
1:foo
2:foo
Вы также можете использовать ack
возможность поиска файлов, которые соответствуют заданному шаблону в их именах файлов (с использованием -g <pattern>
), а затем передать этот список во второй вызов ack
использования -x
или --files-from=-
..
Использование -x
:
$ ack -g '\bbar.*.c$' | ack -x foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
Использование -files-from=-
:
$ ack -g '\bbar.*.c$' | ack --files-from=- foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
В любом случае мы сопоставляем имена файлов, которые вы хотите использовать с помощью этого регулярного выражения:
\bbar.*.c$
Это соответствует файлам , чье имя bar.*c
и конец после того , как с .c
помощью конца строки якоря $
. Мы также стремимся убедиться, что имена имеют ограничивающий символ, используя \b
. Это не удастся для файлов, которые содержат граничные символы, такие как, например, $bar.c
или %bar.c
.
find . -name "bar*.c" -exec ack foo {} \;
? В этом нет ничего особенногоgrep
, вы можете использовать любую команду с find-exec
.