2012-03-22 52 views
2

我發現了很多關於如何搜索jar中存在的文件的例子,但我想找到存在於jar中的文件中的文本。如何在不解壓所有jar文件的情況下做到這一點?在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 
+0

「if [$?== 0]」語法是一種雙擊,它應該是#!/ bin/bash在頂部。 – 2013-07-03 11:42:28

+0

應該還是需要?它沒有像這樣指定它。 – 2013-07-05 11:38:00

+0

這取決於在你的系統上提供/ bin/sh的東西,必須是bash的發行版,但例如ubuntu已經將/ bin/sh切換爲使用破折號,並且它沒有工作。 – 2013-07-05 14:34:08

回答

4

如果你只是想看看是否有任何的jar文件包含一個特定的字符串($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(stdout)。

如果你想知道字符串在哪個文件中,我認爲你可以做任何事情比解壓縮更好。

+0

你能解釋一下如何解包嗎?這適用於我的目的,因爲我不關心哪個文件包含文本,只是JAR包含一個包含文本的文件。 – 2012-03-22 23:23:41

+1

改變這一行:'jar tvf $ i | grep $ LOOK_FOR>/dev/null'到:'unzip -p $ i | grep $ LOOK_FOR>/dev/null',它應該搜索'$ LOOK_FOR'變量中的任何字符串。 – 2012-03-22 23:25:58

2

這裏幾乎是一樣的,但添加了一些參數和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