Pesquisando diretórios
Com base na sinopse mostrada na página man, eu diria que sim, ele pode processar um diretório, mas, olhando para os switches, ele não pode procurar apenas um arquivo baseado em um padrão. Para isso, você precisará inscrever find
. O comando ack
inclui a opção --files-from=FILE
para que possa ser alimentada com uma lista de arquivos de 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 opção --ignore-file=
que pode dar o que você quer, mas parece um pouco difícil 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 posso conceber de fazer exatamente isso via ack
é usar sua opção --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.
Para ver quais tipos estão disponíveis:
$ ack --help-types | grep -E "perl|cpp"
formato . Por exemplo, ambos --type = perl e --perl funcionam. - [não] cpp .cpp .cc .cxx .m .hpp .hh .h .hxx - [não] objcpp .mm .h - [no] perl .pl .pm .pod .t .psgi; primeira linha corresponde /^#!.*\bperl/ - [não] 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 por foo na barra * .c
Então, como você pode conseguir o que quer? Bem, você provavelmente terá que usar find
para fazer 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 a capacidade de ack
de pesquisar arquivos que correspondam a um determinado padrão em seus nomes de arquivos (usando -g <pattern>
) e passar essa lista para uma segunda chamada de ack
usando -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 combinando os nomes de arquivos que você deseja usando este regex:
\bbar.*.c$
Corresponde aos arquivos cujo nome é bar.*c
e termina após .c
usando a âncora de fim de linha, $
. Também procuramos garantir que os nomes tenham um caractere de limite usando \b
. Isso falhará nos arquivos que contêm caracteres de limite, como $bar.c
ou %bar.c
, por exemplo.