Só pode pesquisar através de arquivos que correspondam a um padrão específico de "glob" (por exemplo: procure foo em todos os arquivos denominados "bar * .c"). O comando
ack foo "bar*.c"
funciona apenas no diretório atual.
Nota: Eu sei que é possível com find -exec:
find . -name "bar*.c" -type f -exec ack foo {} +
Mas eu gostaria de um comando ack pequeno e simples, porque find não ignora os diretórios de controle de versão.
find . -name "bar*.c" -exec ack foo {} \;
? Não há nada de especialgrep
, você pode usar qualquer comando com find's-exec
.Respostas:
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 comandoack
inclui a opção--files-from=FILE
para que ele possa receber uma lista de arquivosfind
.sinopse
uso
Existe a
--ignore-file=
opção que pode dar o que você quer, mas parece um pouco doloroso de usar.Pesquisando Tipos Específicos de Arquivos
A única outra maneira que eu posso conceber de fazer exatamente isso
ack
é usar seu--type
switch:Para ver quais tipos estão disponíveis:
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.
Encontre todos os arquivos C ++:
Procurando foo na barra * .c
Então, como você pode conseguir o que deseja? Bem, você provavelmente
find
precisará usar isso: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 deack
uso-x
ou--files-from=-
..Usando
-x
:Usando
-files-from=-
:Em ambos os casos, estamos correspondendo aos nomes de arquivos que você deseja usando este regex:
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.fonte
cpp
arquivosack --type=cpp <string>
. Vejaack
a página de manual para mais sobre tudo isso. Mas o que estou basicamente dizendo é que você não pode pesquisarack
da maneira que deseja.ack
que não pode fazer o que foi solicitado.find adir -iname "bar*.c" | ack --files-from=- foo
. Ou, se você quiser apenas um arquivo:echo "barBaz.c" | ack --files-from=- foo
ack -g '\bbar.*.c$' | ack -x foo
É fácil se o tipo de arquivo é conhecido e o ack conhece vários tipos de arquivos. Portanto, se, por exemplo, você quiser pesquisar apenas arquivos C, poderá:
Mas se não for uma das extensões conhecidas, você precisará definir seu próprio tipo. Isso deve funcionar:
Observe que você precisa de ambos --type-set e --barc.
(Obrigado a Andy, que também ajudou na lista de discussão.)
fonte
man ack
realmente não ajuda e não temcc
quando eu procuro isso."O que há de novo no ack 2?" http://beyondgrep.com/ack-2.0/
Só que não consigo fazer funcionar:
Assim, parece -g precisa de uma regex, enquanto eu quero uma opção de estilo 'glob' ...
fonte
-g
leva uma regex, não uma glob. Você pode escrever seu regex como.*bar.*\.c$
.Parece ser o mais rápido e seguro:
-x Leia a lista de arquivos para pesquisar no STDIN.
No entanto, se é provável que o arquivo esteja no seu
locate
banco de dados, isso seria ainda mais rápido:O Locate também pode aceitar expressões regulares da velha escola, um pouco dolorosas, mas se você estiver procurando por
c
arquivos, pode ser necessário. por exemploIsso apenas se traduz em: "pesquise todos os nomes de arquivos que terminam em c, cpp, h, hpp ou cc".
fonte
O Ack não suporta a seleção de arquivos no estilo glob. Como realmente sinto falta disso, criei um pequeno script de shell ackg :
Agora você pode usar o comando:
Mas observe: isso infelizmente também procurará em diretórios de controle de versão (por exemplo: .git).
fonte
Isso pode ser feito com a
-G
opção ag, o pesquisador prateado (um clone aprimorado do ack-grep).Notas:
ag
usa a sintaxe da expressão regular PCRE , portanto, o regexp deve estar embar.*\.c
vez debar*.c
.-G
opção precisa preceder o termo de pesquisa, pois qualquer coisa a seguir é interpretada como um nome de arquivo.fonte
Você deseja apenas um determinado padrão ou apenas arquivos de origem C?
Se você deseja todos os arquivos C, use
Se você deseja que todos os arquivos C e arquivos de cabeçalho NÃO C usem
fonte
A resposta de @chim é a melhor, mas está escrita como um comentário, por isso estou repostando como uma resposta formal ...
Gosto do fato de que você pode regex o caminho ...
fonte
Usando o zsh, você pode fazer:
fonte
ls
.