Поиск внутри файла внутри JAR - PullRequest
2 голосов
/ 23 марта 2012

Я нашел много примеров того, как искать файлы, которые существуют в банке, но я хочу найти текст, который существует в файле, который существует в банке.Как я могу сделать это, не распаковывая все мои файлы jar?

#!/bin/sh

LOOK_FOR="string to find inside a file inside a jar"

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

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

Если вы просто хотите посмотреть, содержит ли какой-либо файл в банке определенную строку ($LOOK_FOR), но не заботитесь о том, какой файл, вы можете сделать это с помощью unzip, вот небольшой тест:

$ echo hello > a
$ echo world > b
$ jar cf qq.jar a b
$ jar tf qq.jar
META-INF/
META-INF/MANIFEST.MF
a
b
$ unzip -p qq.jar|grep hello
hello

С параметром -p файлы распаковываются в pipe (стандартный вывод).

Если вы хотите знать, в каком файле находится строка, я не думаю, что вы можете сделать что-то лучше, чем распаковать.

2 голосов
/ 29 августа 2013

Здесь почти то же самое, но с некоторыми добавленными аргументами и возвращением grep, дающим всю строку. Я использую это, чтобы контролировать во многих банках некоторые свойства или что-либо связанное с текстом.

#!/bin/sh

# This script is intended to search for named jars ($LOOK_IN_JAR) from a given directory ($PLACE_IN).
# then the list of jars should be opened to look into each one for a specific file ($LOOK_FOR_FILE)
# if found, the file should be grep with a pattern ($PATTERN) which should return the entire line
#
# content of $LOOK_FOR_FILE (properties files) are like :
# key=value
# key2 = value2
# key3= value3
#
# the script should return in console something like :
# found in /path/to/foo.jar :
# pattern=some value
# found in /path/to/bar.jar :
# pattern = another value
# etc.

PLACE_IN=.
LOOK_IN_JAR=*.jar
LOOK_FOR_FILE=""
PATTERN=""

if [ -z "$1" ]
then
echo "at least 2 arguments are mandatory : pattern and files to grep in"
else
PATTERN=$1
echo "Looking for pattern : $PATTERN"
fi

if [ -z "$2" ]
then
echo "at least 2 arguments are mandatory : file to search and pattern to search"
else
LOOK_FOR_FILE=$2
echo "Looking for files $LOOK_FOR_FILE"
fi

if [ -z "$3" ]
then
echo "looking in *.jar"
else
LOOK_IN_JAR=$3
echo "Looking in $LOOK_IN_JAR"
fi

if [ -z "$4" ]
then
echo "looking in ."
else
PLACE_IN=$4
echo "Looking in $PLACE_IN"
fi

for i in $(find $PLACE_IN -name "$LOOK_IN_JAR")
do
echo "Looking in jar $i ..."
unzip -p $i $LOOK_FOR_FILE | zgrep -i --text "$PATTERN"
if [ $? == 0 ]
then
echo -e "\n"
fi
done
...