Pesquisando Diretórios
Com base na sinopse mostrada na página de manual, eu diria que sim, ele pode processar um diretório, mas, olhando para as opções, não pode procurar apenas um arquivo baseado em um padrão. Para isso você terá que se alistar find
. O comando ack
inclui a opção --files-from=FILE
para que ele possa receber uma lista de arquivos find
.
sinopse
ack [options] PATTERN [FILE...]
ack -f [options] [DIRECTORY...]
uso
--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.
Existe a --ignore-file=
opção que pode dar o que você quer, mas parece um pouco doloroso de usar.
--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".
Pesquisando Tipos Específicos de Arquivos
A única outra maneira que eu posso conceber de fazer exatamente isso ack
é usar seu --type
switch:
--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.
Para ver quais tipos estão disponíveis:
$ ack --help-types | grep -E "perl|cpp"
formato. Por exemplo, ambos --type = perl e --perl funcionam. - [no] cpp .cpp .cc .cxx .m .hpp .hh .hxx - [no] objcpp .mm .h - [no] perl .pl .pm .pod .t .psgi; primeira linha corresponde a /^#!.*\bperl/ - [no] perltest .t
Exemplos
Encontre todos os arquivos Perl, com base no nome do arquivo (* .pm, * .pl, * .t e * .pod) e na linha shebang.
$ ack -f --type perl
examples/iwatch/iwatch/iwatch
examples/nytprof_perl/bad.pl
Encontre todos os arquivos C ++:
$ ack -f --type=cpp
Shared/Scanner.h
Shared/Sorter.h
Shared/DicomHelper.cpp
Shared/DicomDeviationWriter.h
Procurando foo na barra * .c
Então, como você pode conseguir o que deseja? Bem, você provavelmente find
precisará usar isso:
$ find adir -iname "bar*.c" | ack --files-from=- foo
adir/bar1.c
1:foo
2:foo
adir/dir1/bar1.c
1:foo
2:foo
Você também pode usar ack
a capacidade de procurar arquivos que correspondam a um determinado padrão em seus nomes de arquivos (usando -g <pattern>
) e depois passar essa lista para uma segunda chamada de ack
uso -x
ou --files-from=-
..
Usando -x
:
$ ack -g '\bbar.*.c$' | ack -x foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
Usando -files-from=-
:
$ ack -g '\bbar.*.c$' | ack --files-from=- foo
bar1.c
1:foo
2:foo
dir1/bar1.c
1:foo
2:foo
Em ambos os casos, estamos correspondendo aos nomes de arquivos que você deseja usando este regex:
\bbar.*.c$
Isso corresponde aos arquivos cujo nome é bar.*c
e termina após o .c
uso da âncora de fim de linha $
,. Também procuramos garantir que os nomes tenham um caractere de limite usando \b
. Isso falhará para arquivos que contenham caracteres de limite como $bar.c
ou %bar.c
por exemplo.
find . -name "bar*.c" -exec ack foo {} \;
? Não há nada de especialgrep
, você pode usar qualquer comando com find's-exec
.