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

Список содержимого нескольких файлов jar

Я ищу файл .class внутри кучи баннеров.

jar tf abc.jar 

работает для одного файла. Я попробовал

find -name "*.jar" | xargs jar tf

ничего не печатает. Единственное решение, о котором я могу думать, - это распаковать все, а затем искать. Есть ли способ лучше? Я нахожусь в LUnix.

Edit: При сканировании многих банок полезно печатать имя файла jar вместе с классом. Этот метод работает хорошо:

find . | grep jar$ | while read fname; do jar tf $fname | grep SchemaBuilder && echo $fname; done

Полученный результат выборки:

  1572 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$1.class
  1718 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$2.class
 42607 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder.class
./XmlSchema-1.3.2.jar
  1572 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$1.class
  1718 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$2.class
 42607 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder.class
./XmlSchema.jar
4b9b3361

Ответ 1

Вам нужно передать -n 1 в xargs, чтобы заставить его запустить отдельную команду jar для каждого имени файла, которое она получает из find:

find -name "*.jar" | xargs -n 1 jar tf

В противном случае строка командной строки xargs выглядит как jar tf file1.jar file2.jar..., которая имеет другое значение для предполагаемого.

Полезная методика отладки заключается в том, чтобы придерживаться echo перед командой, которую должен выполнять xargs:

find -name "*.jar" | xargs echo jar tf

Это выведет полную команду jar вместо ее выполнения, чтобы вы могли увидеть, что с ней не так.

Ответ 2

Вы также можете использовать опцию -exec для поиска

find . -name "*.jar" -exec jar tf {} \;

Ответ 3

Вот что я использую в Cygwin. Он поддерживает заголовки разделов на каждый файл jar, как указано выше.

find . -name "*.jar" \
 -exec echo ======\ {}\ ====== \; \
 -exec /c/Program\ Files/Java/jdk1.7.0_45/bin/jar.exe tf {} \; | less

Для * nix отбросьте ".exe":

find . -name "*.jar" \
 -exec echo ======\ {}\ ====== \; \
 -exec jar tf {} \; | less

Ответ 4

Я столкнулся с аналогичной ситуацией, когда мне нужно найти класс в списке файлов jar, присутствующих в каталоге. Также я хотел знать, из какого файла jar принадлежит класс. Я использовал этот ниже фрагмент кода (shell script) и обнаружил, что он полезен. Ниже script будет отображаться список файлов jar, содержащий класс для поиска.

#!/bin/sh
LOOK_FOR="codehaus/xfire/spring"
for i in `find . -name "*jar"`
do
  echo "Looking in $i ..."
  jar tvf $i | grep $LOOK_FOR > /dev/null
  if [ $? == 0 ]
  then
    echo "==> Found \"$LOOK_FOR\" in $i"
  fi
done

Shell script взято из: http://alvinalexander.com/blog/post/java/shell-script-search-search-multiple-jar-files-class-pattern

Ответ 5

Вы также можете использовать unzip, который быстрее, чем jar (-l для печати zip-контента).

Например, небольшой script, который делает примерно то, что вы хотите:

#!/bin/bash

for i in $(find . -name "*.jar")
do
    if [ -f $i ]
then
    echo $i
    unzip -l $i | grep $*
fi
done

Ответ 6

Я не вижу необходимости использовать exec, это сработало для меня в Cygwin в Windows:

find . -name "*.jar" | while read jarfile; do unzip -l $jarfile | fgrep "foo" ; done 

Ответ 7

Если вы используете Eclipse, вы можете создать проект и добавить все банки. Затем вы сможете найти класс в любой из банок.