Я пытаюсь найти все 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
файл не возвращается, а я думаю, это то, что вы ищете.
Теперь, чтобы понять, что делает ваша команда,
- Сначала я создал файл Java с именем
springtest
. - Теперь я создаю
class
файл, выполнивjava
команду дляjava
файла. - Теперь я добавляю его в jar-файл, выполнив команду jar.
Теперь, когда я выполню вашу команду, она вернет мне файл
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