caminho mais rápido para o arquivo jar grep para um nome particular nele?

7

Estou tentando encontrar todos os jars que possuem spring em seu nome. Eu estou trabalhando com windows e usando cygwin para executar os comandos do Linux. O meu comando abaixo parece certo?

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

Por algum motivo, ele ainda está sendo processado e não obteve o resultado na tela. Qualquer maneira rápida de grep o arquivo jar com um nome específico?

Por exemplo, abaixo estão os arquivos jar válidos que possuem uma fonte -

spring-web.jar
spring-core.jar
test-spring.jar 
    
por arsenal 16.06.2014 / 22:06

2 respostas

3

Eu não acredito que o comando jar aceite vários arquivos .jar por meio de argumentos, portanto, uma única chamada de jar do AFAIK endereçando todos os arquivos .jar está fora de questão. Uma opção para acelerar as coisas evitando uma invocação find exec para cada arquivo .jar é a seguinte

find . -name '*.jar' -exec sh -c \
'for f; do  jar -tf "$f" | grep --label="$f" "spring"; done' sh {} +
    
por 16.06.2014 / 22:26
2

O comando abaixo procuraria os arquivos jar com substring spring .

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

Agora, seu comando original examina o conteúdo, que não é o que o texto em torno dele ou os exemplos dizem.

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

Encontre esta descrição do bate-papo, onde Gilles explica por que 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 arquivo spring.txt 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 como springtest .
  2. Agora, eu crio o arquivo class executando o comando java no java file.
  3. Agora, adiciono-o ao arquivo jar executando o comando jar.
  4. Agora, quando eu executar seu comando, ele retornará o arquivo class 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
    
por 16.06.2014 / 23:04

Tags