Pesquisar TODOS os arquivos com ack

14

Como posso pesquisar todos os arquivos (incluindo binários) no diretório atual com a ackv2?

Quero fazer o mesmo que fazer ack 'foo' **, mas apenas com um sinalizador, para que funcione se desejar pesquisar todos os arquivos em um diretório específico sem anexar **.


Diferença entre ack 'foo'e ack 'foo' **:

$ mkdir test && cd test
$ printf '\x00\x01foo1\x00' > test1
$ printf 'foo2' > test2
$ ack 'foo'
test2
1:foo2
$ ack 'foo' **
test1
1:foo1

test2
1:foo2
Tyilo
fonte
Por que você deseja usar ack para isso em vez de grep?
Andy Lester
1
@AndyLester Eu apenas pensei que acké sempre melhor do que grep. Eu estava errado :).
Tyilo

Respostas:

6

Por padrão, o Ack procura um padrão em todos os arquivos não binários abaixo do diretório atual.

Acredito que versões mais antigas do Ack pesquisariam arquivos binários quando você passasse a --binarybandeira para eles . Este sinalizador foi removido. Você pode usar o grep.

grep -ar 'foo' .

fonte
Não tem nada a ver com links simbólicos. Tem a ver com arquivos binários!
Tyilo 23/07
@ Tyilo: eu modifiquei minha resposta.
13

Quando você não passa um nome de arquivo para confirmação, ele opera em um conjunto de arquivos padrão interno que exclui arquivos binários não reconhecidos. Se você passar nomes de arquivos, ele procurará em todos os arquivos que você passar. Isso explica a diferença entre ack fooe ack foo **.

ack 1

No ack 1.x, use o sinalizador -apara informar ao ack para não ignorar arquivos cujo tipo ele não reconhece.

Você pode criar um alias se desejar que o sinalizador seja mais frequente: adicione a linha alias ack='ack -a'no seu ~/.bashrcou ~/.zshrc. Se você configurar esse alias e quiser chamar acksem a opção, ligue \ack(a barra invertida desativa a expansão do alias). Os scripts não são afetados pelo alias, apenas shells interativos.

Como alternativa, você pode adicionar a -aopção ao seu ~/.ackrc.

As correspondências nos arquivos binários serão listadas como "Correspondências nos arquivos binários test1". Não há como desativar esse comportamento sem modificar o próprio Ack (pelo menos adicionar um plug-in).

ack 2

No ack 2.0, a -aopção foi removida. O que você pode fazer é definir um tipo que corresponda a todos os arquivos e usar a -kopção para fazer com que o ack inclua todos os arquivos desse tipo. Observe que os tipos de arquivo são processados ​​em uma ordem imprevisível, pois isso fará com que um conjunto aleatório de tipos binários seja processado como normal, em vez do tipo usual.

ack --type-set='all:match:.*' -k foo

Dessa forma, as correspondências são impressas mesmo para arquivos que, de outra forma, pareceriam binários. Como acima, você pode adicionar essas opções a um alias ou ao seu .ackrc.

Gilles 'SO- parar de ser mau'
fonte
1
Isso é bem sorrateiro, @Gilles.
Andy Lester
@ AndyLester, por que a opção -a foi removida? O retorno "Isso é porque" na verdade não explica por que não consigo mais pesquisar tipos de arquivos não reconhecidos.
Yann Dìnendal
Como o comportamento -x do 1.x, para pesquisar todos os arquivos de texto não reconhecidos, agora é o padrão no 2.0.
Andy Lester
2
Estranho, eu tenho um arquivo js minificado que nem mesmo esse conjunto de tipos especial de correspondência de todos os tipos pode encontrar ...
Izkata
Estou aqui por causa disso: um texto dentro de um arquivo js minificado, que não é analisado pelo ack. Eu pensei que a resposta seria como "add -a" ... Estou desapontado.
Luciano Fantuzzi