maneira mais rápida de usar o arquivo jar grep para um nome específico nele?

maneira mais rápida de usar o arquivo jar grep para um nome específico nele?

Estou tentando encontrar todos os potes que tem springno nome. Estou trabalhando com Windows e usando o cygwin para executar os comandos do Linux. Meu comando abaixo parece certo?

find . -name "*.jar" -exec jar tf '{}' \| grep -H "spring" \;

Por algum motivo, ainda está processando e não aparece o resultado na tela. Alguma maneira rápida de usar o grep no arquivo jar com um nome específico?

Por exemplo, abaixo estão os arquivos jar válidos que contêm spring -

spring-web.jar
spring-core.jar
test-spring.jar 

Responder1

Não acredito que o jarcomando aceite vários .jararquivos por meio de argumentos, portanto, uma única jarinvocação do AFAIK abordando todos .jaros arquivos está fora de questão. Uma opção para acelerar as coisas evitando uma findinvocação exec para cada .jararquivo é a seguinte

find . -name '*.jar' -exec sh -c \
'for f; do  jar -tf "$f" | grep --label="$f" "spring"; done' sh {} +

Responder2

O comando abaixo procuraria os arquivos jar que contêm substring spring.

find /some/dir -type f -name "*spring*.jar"

Agora, seu comando original examina o conteúdo, que não é o que diz o texto ou os exemplos.

find . -name "*.jar" -exec jar tf '{}' \| grep -H "spring" \;

Por favor acheessedescrição do chat onde Gilles explica porque o comando acima não é o que você está procurando.

Teste

[root@keithpc check]# cd jar_check/
[root@keithpc jar_check]# ls
[root@keithpc jar_check]# touch spring1.jar
[root@keithpc jar_check]# touch 1spring.jar
[root@keithpc jar_check]# touch no_sss_spring.jar
[root@keithpc jar_check]# touch spring.txt

Saída:

[root@keithpc jar_check]# find ./ -type f -name "*spring*.jar"
./no_sss_spring.jar
./1spring.jar
./spring1.jar

Como você pode ver, o spring.txtarquivo não foi retornado, o que acredito ser o que você está procurando.

Agora, para entender o que seu comando faz,

  1. Primeiro criei um arquivo java que tem o nome springtest.
  2. Agora, eu crio o classarquivo executando o javacomando no javaarquivo.
  3. Agora, adiciono-o ao arquivo jar executando o comando jar.
  4. Agora, quando eu executar seu comando, ele retornará o classarquivo em vez do arquivo jar que você está procurando.

     [root@keithpc jar_check1]# javac springtest.java
     [root@keithpc jar_check1]# java springtest
     Hello,spring
     [root@keithpc jar_check1]# jar cvf springtest.jar springtest.class
     added manifest
     adding: springtest.class(in = 426) (out= 286)(deflated 32%)
    
     ##Here I run your command after creating the jar file. 
    
     [root@keithpc jar_check1]# find . -name "*.jar" -exec jar tf '{}' \| 
     grep -H "spring" \;
     ##As you can see, it returns me the class file rather than the 
     jar file as the output.  
    
     springtest.class
    

informação relacionada