web-dev-qa-db-ja.com

jarパスに関係なく、jarの中からクラスファイルを検索するLinux cmd

各jarファイルの場所を指定せずに、多くのjarファイルから特定のクラスファイルを検索したい。

これは簡単なコマンドで可能ですか?

私はこのコマンドを試しました:

grep Hello.class *.jar

クラスを含むjarのリストを返しませんでした。次に、コマンドを実行しました:

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

これは関連するjarファイルを返しました。もっと良い方法はありますか?

45
AlwaysALearner

Jarファイルはどこにありますか?彼らがどこにいるかを見つけるパターンはありますか?

1.それらはすべて1つのディレクトリにありますか?

たとえば、foo/a/a.jarfoo/b/b.jarはすべてfoo/フォルダーの下にあります。この場合、findgrepを使用できます。

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

確かに、少なくともルートディレクトリ/でそれらを検索できますが、遅くなります。

@loganaayaheeが言ったように、コマンドlocateも使用できます。 locateはインデックスを使用してファイルを検索するため、高速になります。ただし、コマンドは次のようにする必要があります。

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

Jarファイルのコンテンツを検索するため。

2.パスは環境変数に保存されていますか?

通常、JavaはCLASS_PATHなどの環境変数にjarファイルを見つけるためのパスを格納しますが、これがあなたの望むものかどうかはわかりません。 this:CLASS_PATH=/lib:/usr/lib:/bin、これは:を使用してパスを分離し、このコマンドを使用してクラスを検索できます。

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

ほとんどのソリューションは、grepコマンドを直接使用してクラスを見つけています。ただし、クラスのパッケージ名は提供されません。また、jarが圧縮されている場合、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 {}'
28
Wenbing Li

Jarを含むディレクトリに移動し、以下のコマンドを挿入します。

find *.jar | xargs grep className.class

お役に立てれば!

4
tk_

Linux、多くのjarからクラスファイルを見つけるためのウォークスルー。

下のjarを含むディレクトリに移動します。

eric@dev /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クラスに提供するjarを探しています。

Forループの仕組みを理解します。

eric@dev /home/el/kafka_2.10-0.8.1.1/libs $ for i in `seq 1 3`; do
> echo $i
> done
1
2
3

これが機能する理由を理解する:

eric@dev /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

下のすべてのjarをforループに送り込むことができます。

eric@dev /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

これでそれぞれを操作できます:

jar tfすべてのjarで、blah.txtに詰め込みます。

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

Blah.txtを調べます。これは、すべてのjar内のすべてのクラスのリストです。必要なクラスをそのファイルで検索し、その前にあるjarを探します。それが目的のjarです。

2
Eric Leschinski
   locate *.jar | grep Hello.class.jar

特定のファイルのすべてのパスを検索し、ファイルの完全なパスを表示するためのロケートコマンド。

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
2
loganaayahee

Deepgrepとdeepfindを使用します。 Debianベースのシステムでは、次の方法でインストールできます。

Sudo apt-get install strigi-utils

両方のコマンドは、ネストされたアーカイブも検索します。あなたの場合、コマンドは次のようになります。

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

この小さなスニペットを使用しました。遅いかもしれませんが、毎回動作します。

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
0
aayush singhal