Подтвердить что ты не робот

Linux cmd для поиска файла класса между банками независимо от пути jar

Я хочу искать определенный файл класса среди многих файлов jar, не указывая местонахождение каждого файла jar.

Возможно ли это с помощью простой команды?

Я пробовал эту команду:

grep Hello.class *.jar

Который не возвратил список банок, содержащих класс. Затем я выполнил команду:

grep Hello.class /full/path/of/jar/file/*.jar

Который возвратил соответствующий файл jar. Есть ли лучший способ?

4b9b3361

Ответ 1

Где вы файлы jar? Есть ли шаблон, чтобы найти, где они находятся?

1. Все ли они в одном каталоге?

Например, foo/a/a.jar и foo/b/b.jar находятся под папкой foo/, в этом случае вы можете использовать find с grep:

find foo/ -name "*.jar" | xargs grep Hello.class

Конечно, по крайней мере, вы можете искать их в корневом каталоге /, но он будет медленным.

Как сказал @loganaayahee, вы также можете использовать команду locate. locate искать файлы с индексом, поэтому он будет быстрее. Но команда должна быть:

locate "*.jar" | xargs grep Hello.class

Поскольку вы хотите искать содержимое файлов jar.

2. Являются ли пути хранятся в переменной среды?

Как правило, Java будет хранить пути для поиска файлов jar в переменной среды, например CLASS_PATH, я не знаю, действительно ли это то, что вы хотите. Но если ваша переменная такова: CLASS_PATH=/lib:/usr/lib:/bin, которая использует : для разделения путей, вы можете использовать эту оценку для поиска в классе:

for P in `echo $CLASS_PATH | sed 's/:/ /g'`; do grep Hello.calss $P/*.jar; done

Ответ 2

Большинство решений напрямую используют команду grep для поиска класса. Однако это не даст вам имя пакета класса. Кроме того, если сжатие сжимается, grep не будет работать.

Это решение использует команду jar, чтобы отобразить содержимое файла и grep класс, который вы ищете.

Он выведет класс с именем пакета, а также имя файла jar.

find . -type f -name '*.jar' -print0 |  xargs -0 -I '{}' sh -c 'jar tf {} | grep Hello.class &&  echo {}'

Вы также можете выполнить поиск с именем своего пакета, как показано ниже:

find . -type f -name '*.jar' -print0 |  xargs -0 -I '{}' sh -c 'jar tf {} | grep com/mypackage/Hello.class &&  echo {}'

Ответ 3

Просто перейдите в каталог, содержащий банки, и вставьте команду ниже:

find *.jar | xargs grep className.class

Надеюсь, это поможет!

Ответ 4

   locate *.jar | grep Hello.class.jar

Команда locate для поиска по всему пути к определенному файлу и отобразить полный путь к файлу.

Пример

locate *.jar | grep classic.jar

/opt/ltsp/i386/usr/share/firefox/chrome/classic.jar

/opt/ltsp/i386/usr/share/thunderbird/chrome/classic.jar

/root/.wine/drive_c/windows/gecko/0.1.0/wine_gecko/chrome/classic.jar

/usr/lib/firefox-3.0.14/chrome/classic.jar

/usr/lib/firefox-3.5.2/chrome/classic.jar

/usr/lib/xulrunner-1.9.1.2/chrome/classic.jar

/usr/share/firefox/chrome/classic.jar

/usr/share/thunderbird/chrome/classic.jar

Ответ 5

Используйте deepgrep и deepfind. В дебианских системах вы можете установить их:

sudo apt-get install strigi-utils

Обе команды также ищут вложенные архивы. В вашем случае команда будет выглядеть так:

find . -name "*.jar" | xargs -I {} deepfind {} | grep Hello.class

Ответ 6

Linux, пошаговое руководство, чтобы найти файл класса среди множества банок.

Перейдите в каталог, в котором находятся баночки внизу.

[email protected] /home/el/kafka_2.10-0.8.1.1/libs $ ls
blah.txt                             metrics-core-2.2.0.jar
jopt-simple-3.2.jar                  scala-library-2.10.1.jar
kafka_2.10-0.8.1.1-sources.jar       zkclient-0.3.jar
kafka_2.10-0.8.1.1-sources.jar.asc   zookeeper-3.3.4.jar
log4j-1.2.15.jar

Я ищу, какая банка предназначена для класса Producer.

Понимать, как работает цикл for:

[email protected] /home/el/kafka_2.10-0.8.1.1/libs $ for i in `seq 1 3`; do
> echo $i
> done
1
2
3

Поймите, почему это работает:

[email protected] /home/el/kafka_2.10-0.8.1.1/libs $ find . -name "*.jar"
./slf4j-api-1.7.2.jar
./zookeeper-3.3.4.jar
./kafka_2.10-0.8.1.1-javadoc.jar
./slf4j-1.7.7/osgi-over-slf4j-1.7.7-sources.jar

Вы можете перекачивать все банки под контуром цикла:

[email protected] /home/el/kafka_2.10-0.8.1.1/libs $ for i in `find . -name "*.jar"`; do
> echo $i
> done

./slf4j-api-1.7.2.jar
./zookeeper-3.3.4.jar
./kafka_2.10-0.8.1.1-javadoc.jar
./kafka_2.10-0.8.1.1-sources.jar

Теперь мы можем работать на каждом из них:

Сделайте a jar tf на каждой банке и вставьте ее в blah.txt:

for i in `find . -name "*.jar"`; do echo $i; jar tf $i; done > blah.txt

Проверьте blah.txt, это список всех классов во всех баночках. Вы можете искать этот файл для нужного вам класса, а затем искать банку, которая была перед ним, и тот, который вы хотите.

Ответ 7

Я использовал этот небольшой фрагмент. Может быть медленнее, но работает каждый раз.

for i in 'find . -type f -name "*.jar"'; do
    jar tvf $i | grep "com.foo.bar.MyClass.clss";
    if [ $? -eq 0 ]; then echo $i; fi;
done

Ответ 8

[email protected] /home/el/kafka_2.10-0.8.1.1/libs $ for i in `find . -name "*.jar"`; do
> echo $i
> done

./slf4j-api-1.7.2.jar
./zookeeper-3.3.4.jar
./kafka_2.10-0.8.1.1-javadoc.jar
./kafka_2.10-0.8.1.1-sources.jar