Linux cmd可以在jar之间search类文件,而不pipejarpath如何

我想在许多jar文件中search一个特定的类文件而不给每个jar文件的位置。

这是可能的一个简单的命令?

我试过这个命令:

grep Hello.class *.jar 

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

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

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

你在哪里jar文件? 有没有find他们在哪里的模式?

他们都在一个目录中吗?

例如, foo/a/a.jarfoo/b/b.jar都位于文件夹foo/ ,在这种情况下,您可以使用findgrep

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

当然,至less你可以在根目录下search它们,但速度会很慢。

正如@loganaayahee所说,你也可以使用命令locatelocatesearch与索引的文件,所以它会更快。 但是这个命令应该是:

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

既然你想searchjar文件的内容。

2.path是否存储在环境variables中?

通常情况下,Java将存储path来查找像CLASS_PATH这样的环境variables的jar文件,我不知道这是否是你想要的。 但是,如果你的variables是这样的: CLASS_PATH=/lib:/usr/lib:/bin ,它使用:来分隔path,那么你可以使用这个命令来search类:

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

大多数解决scheme都是直接使用grep命令来查找类。 但是,它不会给你这个类的包名称。 另外,如果jar被压缩, grep将不起作用。

这个解决scheme是使用jar命令来列出文件的内容和grep你正在寻找的类。

它将打印出包名 文件名

 find . -type f -name '*.jar' -print0 | xargs -0 -I '{}' sh -c 'jar tf {} | grep Hello.class && echo {}' 

您也可以使用您的包名称进行search,如下所示:

 find . -type f -name '*.jar' -print0 | xargs -0 -I '{}' sh -c 'jar tf {} | grep com/mypackage/Hello.class && echo {}' 

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

 find *.jar | xargs grep className.class 

希望这可以帮助!

  locate *.jar | grep Hello.class.jar 

locate命令用于search特定文件的所有path并显示文件的完整path。

 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 

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

 sudo apt-get install strigi-utils 

这两个命令也search嵌套的档案。 在你的情况下,这个命令看起来像:

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

Linux,Walkthrough在许多jar子中find一个类文件。

转到包含下面的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 

我正在寻找哪个jar提供给Producer类。

了解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 

您可以将下面的所有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子上做一个jar子,然后塞进blah.txt中:

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

检查blah.txt,这是所有jar子中所有类的列表。 你可以search这个文件,find你想要的类,然后查找它之前的jar,那就是你想要的。

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

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