De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: André Leon S. Gradvohl
Data de Publicação: 18 de setembro de 2014
Tenho colaborado com outros desenvolvedores em um código fonte de um sistema distribuído feito em Java. O código desse sistema é muito grande, possui muitas classes e quem conhece Java sabe que essas classes ficam espalhadas em muitos arquivos.
As vezes preciso observar como foi utilizado um método de um objeto, mas nem sempre me lembro em que classe esse objeto foi usado. Até pouco tempo, eu usava o grep
. Porém, a quantidade de parâmetros que eu tinha que passar para o grep
estavam começando a aumentar muito em função das especificidades da minha busca e da quantidade de arquivos que o sistema tinha.
Daí, pesquisando sobre uma forma mais eficiente de fazer essa busca, encontrei o ack
. Como o próprio autor do software afirma, o ack
foi projetado para programadores com grandes árvores de código-fonte heterogêneos.
Basicamente, o ack
substitui o grep
ao fazer uma busca por uma determinada string nos arquivos de toda uma árvore de diretórios. Para mim, as vantagem são que, por default, os resultados do ack
são coloridos e indicam as linhas onde a string indicada foi encontrada em cada arquivo.
Vejamos um exemplo. Considere o comando a seguir
ack PolicyRules
Esse comando vai procurar a string PolicyRules
em todos os arquivos do diretório corrente e de todos os diretórios abaixo do nível atual.
O resultado é o seguinte (limitei a poucas linhas apenas para ilustração):
seep-system/src/main/java/uk/ac/imperial/lsds/seep/api/QueryPlan.java 25:import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.PolicyRules; 53: private PolicyRules policyRules; 255: public void withPolicyRules(PolicyRules rules) { 260: public PolicyRules getPolicyRules() { seep-system/src/main/java/uk/ac/imperial/lsds/seep/api/QueryBuilder.java 18:import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.PolicyRules; 78: public static void withPolicyRules(PolicyRules rules) { 79: qp.withPolicyRules(rules);
No meu caso, para aumentar a velocidade da busca, eu a limito aos arquivos .java
. A sintaxe fica assim:
ack --java PolicyRules
Para reduzir o número de diretórios, posso, por exemplo, informar para o ack
ignorar o diretório test
da seguinte forma:
ack --java --ignore-dir test PolicyRules
Além de arquivos Java, o ack
faz buscas em outros tipos de arquivos pré-definidos, por exemplo C++ (inclui .cpp
, .cc
, .cxx
, .m
, .hpp
, .hh
, .h
, .hxx
), C (inclui .c
, .h
, .xs
), Fortran (inclui .f
, .f77
, .f90
, .f95
, .f03
, .for
, .ftn
, .fpp
), dentre outros tipos.
Salvo engano, o ack
já vem por padrão no Debian. Mas, você pode obter detalhes sobre o ack
e como instalá-lo no site a seguir:
A propósito, um Easter Egg para os fans de Star Wars e do Almirante Ackbar: execute o programa da seguinte forma
ack --bar
É isso.
André Leon S. Gradvohl é docente na Faculdade de Tecnologia da UNICAMP. Atualmente ele está realizando Pós-doutorado na França no Laboratoire d'Informatique de Paris 6 (LIP6), na área de Sistemas Distribuídos.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários