53

我想在许多 jar 文件中搜索特定的类文件,而不给出每个 jar 文件的位置。

这可以通过一个简单的命令实现吗?

我试过这个命令:

grep Hello.class *.jar

哪个没有返回包含该类的 jar 列表。然后我运行命令:

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

哪个确实返回了相关的 jar 文件。有没有更好的办法?

4

8 回答 8

96

你在哪里的jar文件?是否有模式可以找到它们的位置?

1.它们都在一个目录中吗?

例如,foo/a/a.jarandfoo/b/b.jar都在文件夹下foo/,在这种情况下,您可以使用findwith grep

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

当然,至少你可以在根目录下搜索它们/,但它会很慢。

正如@loganaayahee 所说,您也可以使用 command locatelocate使用索引搜索文件,这样会更快。但命令应该是:

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

由于您要搜索 jar 文件的内容。

2. 路径是否存储在环境变量中?

通常,Java 会将查找 jar 文件的路径存储在类似的环境变量中CLASS_PATH,我不知道这是否是您想要的。但是如果你的变量是这样的: CLASS_PATH=/lib:/usr/lib:/bin,它使用 a:来分隔路径,那么你可以使用这个命令来搜索类:

for P in `echo $CLASS_PATH | sed 's/:/ /g'`; do grep Hello.calss $P/*.jar; done
于 2013-01-17T08:21:20.367 回答
39

大多数解决方案都是直接使用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 {}'
于 2013-10-09T01:37:56.360 回答
4

只需转到包含 jar 的目录并插入以下命令:

find *.jar | xargs grep className.class

希望这可以帮助!

于 2015-02-12T08:37:12.617 回答
2
   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
于 2013-01-17T11:15:07.907 回答
2

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

了解为什么 find 这有效:

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

您可以将下面的所有罐子泵入 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并将其塞进 blah.txt 中:

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

检查 blah.txt,它是所有 jar 中所有类的列表。您可以在该文件中搜索您想要的类,然后查找它之前的 jar,那就是您想要的那个。

于 2014-08-22T18:39:55.220 回答
2

我已经使用了这个小片段。可能会更慢,但每次都有效。

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
于 2016-06-06T04:24:34.670 回答
1

使用 deepgrep 和 deepfind。在基于 debian 的系统上,您可以通过以下方式安装它们:

sudo apt-get install strigi-utils

这两个命令也搜索嵌套档案。在您的情况下,命令如下所示:

find . -name "*.jar" | xargs -I {} deepfind {} | grep Hello.class
于 2014-06-11T09:48:24.437 回答
-1
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
于 2016-05-11T10:04:01.967 回答