Самый быстрый способ выполнить grep jar-файл на предмет определенного имени в нем?

Самый быстрый способ выполнить grep jar-файл на предмет определенного имени в нем?

Я пытаюсь найти все jar-файлы, которые имеют springв своем имени. Я работаю с Windows и использую cygwin для запуска команд Linux. Моя команда ниже выглядит правильно?

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

По какой-то причине он все еще обрабатывается и не выводит результат на экран. Есть ли быстрый способ grep файла jar с определенным именем?

Например, ниже приведены допустимые jar-файлы, содержащие Spring:

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

решение1

Я не верю, что jarкоманда принимает несколько .jarфайлов в качестве аргументов, поэтому, насколько мне известно, один jarвызов, адресующий все .jarфайлы, невозможен. Один из вариантов ускорить процесс, избежав одного findвызова exec для каждого .jarфайла, следующий:

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

решение2

Приведенная ниже команда будет искать jar-файлы, содержащие подстроку spring.

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

Итак, ваша исходная команда просматривает содержимое, а не то, что говорится в тексте вокруг нее или в примерах.

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

Пожалуйста найдиэтотописание чата, в котором Жиль объясняет, почему указанная выше команда — не то, что вы ищете.

Тестирование

[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

Выход:

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

Как видите, spring.txtфайл не возвращается, а я думаю, это то, что вы ищете.

Теперь, чтобы понять, что делает ваша команда,

  1. Сначала я создал файл Java с именем springtest.
  2. Теперь я создаю classфайл, выполнив javaкоманду для javaфайла.
  3. Теперь я добавляю его в jar-файл, выполнив команду jar.
  4. Теперь, когда я выполню вашу команду, она вернет мне файл class, а не jar-файл, который вы ищете.

     [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
    

Связанный контент