Eu estava tentando encontrar o JAR contendo uma classe Java. Os JARs estão no formato zip.
Minha primeira tentativa foi:
$ find -name "*3.0.6.RELEASE.jar" | xargs -l1 unzip -l \
| grep stereotype.Controller
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
Eu encontrei a classe, mas ainda não sei qual dos 25 arquivos correspondentes contém (há dois JARs contendo). Então, pensei em usar tee
no meio para gerar os nomes dos arquivos.
$ find -name "*3.0.6.RELEASE.jar" | tee - | xargs -l1 unzip -l \
| grep stereotype.Controller
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
Eu esperaria ver um nome de arquivo seguido pelo Controller.class para arquivos correspondentes e pelo próximo nome de arquivo para não fazer o mathing. No entanto, agora que penso nisso, a saída padrão apenas flui no pipe e é processada por xargs, portanto, faz sentido.
Eu poderia usar o erro padrão, mas, suponho, como os processos estão sendo executados simultaneamente, eu poderia ter problemas de tempo que deixam a saída fora da ordem que espero ver.
Portanto, deve haver uma maneira melhor de abordar esse problema, alguém tem idéias?
ATUALIZAÇÃO : Enquanto esperava por uma resposta, eu escrevi um horrível forro de Perl que faz o truque, mas estou ansioso para ver soluções mais elegantes.
$ find -name "*3.0.6.RELEASE.jar" | perl -e 'while (<>) { \
$file=$_; @class='unzip -l $_'; foreach (@class) { \
if (/stereotype.Controller/) {print "$file $_";} } }'
Saída:
./spring-context/3.0.6.RELEASE/spring-context-3.0.6.RELEASE.jar
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
./org.springframework.context/3.0.6.RELEASE/org.springframework.context-3.0.6.RELEASE.jar
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class