Procura nomes de classes em frascos

3

Estou usando esse comando para pesquisar arquivos * .jar em classes java e só recebo o nome dos jars que contêm essas classes:

grep -ral --include=*.jar SignonEJB .

Como eu também posso obter os nomes das classes na saída?

    
por Henrique Ordine 19.05.2013 / 13:59

2 respostas

4

Você passou a opção -l , informando grep para listar apenas os nomes dos arquivos. Esses são os nomes dos arquivos .jar , não há outros arquivos envolvidos.

Se você quiser que grep envie os nomes das classes, será necessário remover -l . Mas isso imprimirá muitas outras porcarias na mesma “linha”, porque os frascos são arquivos binários, não organizados por linhas. (Com o GNU grep, você precisa passar -a para obter essa saída e não apenas “Arquivo binário… corresponde”.)

Com o GNU grep, uma possibilidade é combinar o nome completo da classe e passar -o para produzir apenas isso:

grep -rao --include='*.jar' '[0-9A-Z_a-z]*SignonEJB[0-9A-Z_a-z]*' .

ou se você quiser os pacotes também

grep -rao --include='*.jar' '[$./0-9A-Z_a-z]*SignonEJB[0-9A-Z_a-z]*' .

Outra abordagem é executar strings nos arquivos primeiro para extrair sequências imprimíveis. (Os dois comandos são equivalentes; a versão sed engole em \& e newline, a versão awk suporta todos os caracteres.)

find . -name '*.jar' -exec sh -c 'strings "$0" | grep SignonEJB | sed "s&^&$0&"' {} \;
find . -name '*.jar' -exec sh -c 'strings "$0" | jar=$0 awk "/SignonEJB/ {print ENVIRON[\"jar\"] \":\" $0}"' {} \;

Como alternativa (e estritamente falando, mais confiável, mesmo que seja improvável que usar grep apresente falsos positivos), use unzip para listar os nomes dos arquivos e filtrar isso.

find . -name '*.jar' -exec sh -c 'unzip -l -- "$0" | grep SignonEJB' {} \;
    
por 19.05.2013 / 14:11
3

Talvez (com ferramentas GNU):

grep -ralZ --include='*.jar' SignonEJB . |
  xargs -r0IJ unzip -l J '*SignonEJB*.class'

Ou talvez um pouco mais confiável e com uma saída mais fácil de ler:

find . -name '*.jar' -exec sh -c 'export i; for i do
    zipinfo -1 "$i" | awk '\''/SignonEJB.*\.class$/{
      print ENVIRON["i"] ": " $0}'\''; done' sh {} +
    
por 19.05.2013 / 22:32

Tags