¿La forma más rápida de grep un archivo jar para un nombre particular en él?

¿La forma más rápida de grep un archivo jar para un nombre particular en él?

Estoy tratando de encontrar todos los frascos que tiene springsu nombre. Estoy trabajando con Windows y usando cygwin para ejecutar los comandos de Linux. ¿Mi siguiente comando se ve bien?

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

Por alguna razón, todavía se está procesando y no aparece el resultado en la pantalla. ¿Alguna forma rápida de recuperar el archivo jar con un nombre particular?

Por ejemplo, a continuación se muestran los archivos jar válidos que contienen Spring:

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

Respuesta1

No creo que el jarcomando acepte múltiples .jararchivos a modo de argumentos, por lo que AFAIK una sola jarinvocación que aborde todos .jarlos archivos está fuera de discusión. Una opción para acelerar las cosas evitando una findinvocación ejecutiva para cada .jararchivo es la siguiente

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

Respuesta2

El siguiente comando buscará los archivos jar que contengan una subcadena spring.

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

Ahora, su comando original revisa el contenido, que no es lo que dice el texto que lo rodea o los ejemplos.

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

Por favor encuentraesteDescripción del chat donde Gilles explica por qué el comando anterior no es lo que estás buscando.

Pruebas

[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

Producción:

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

Como puede ver, el spring.txtarchivo no se devuelve, lo cual creo que es lo que está buscando.

Ahora, para entender lo que hace tu comando,

  1. Primero, creé un archivo java que tiene el nombre springtest.
  2. Ahora creo el classarchivo ejecutando el javacomando en el javaarchivo.
  3. Ahora lo agrego al archivo jar ejecutando el comando jar.
  4. Ahora, cuando ejecuto su comando, me devolverá el classarchivo en lugar del archivo jar que está buscando.

     [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
    

información relacionada