2012-03-22 11 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]"の構文はbashismです。先頭に#!/ bin/bashを付けてください。 –

+0

する必要がありますか?それはそのように指定することなく機能しました。 –

+0

あなたのシステムに/ bin/shを提供するものに依存し、bashのディストリビューションでなければなりませんが、例えば、ubuntuは/ bin/shにダッシュを代わりに使用しました。 –

答えて

4

あなたはちょうどあなたがunzipでこれを行うことができ、jarファイル内のファイルのいずれかが特定の文字列($LOOK_FOR)が含まれているかどうかを確認したいのですが、どのファイルを気にしない場合は、ここでの小規模なテストです: -pオプションで

$ 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 

、ファイルがパイプ(stdout)に解凍されます。

文字列がどのファイルであるかを知りたい場合は、アンパックよりも何もできないと思います。

+0

アンパックでどうやってやるのか説明できますか?これは私の目的のために働きます。なぜなら、どのファイルにテキストが含まれているか気にしないからです.JARにはテキストを含むファイルが含まれています。 –

+1

次の行を変更してください: 'jar tvf $ i | grep $ LOOK_FOR>/dev/null'を 'unzip -p $ i | grep $ LOOK_FOR>/dev/null'と '$ LOOK_FOR'変数の文字列を' $ i'変数を使ってjarポインタ内のファイルで検索します。 –

2

ここではほとんど同じですが、いくつかの引数が追加され、grepが行全体を返します。私はこれを使用して、多くのjarファイルでいくつかのプロパティや何らかのテキストを制御しています。

#!/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