我想在许多jar文件中搜索特定的类文件,而不给出每个jar文件的位置。
这可以通过一个简单的命令来实现吗?
我试过这个命令:
grep Hello.class *.jar
哪个没有返回包含该类的jar列表。然后我运行了命令:
grep Hello.class /full/path/of/jar/file/*.jar
确实返回了相关的jar文件。还有更好的方法吗?
答案 0 :(得分:79)
你在哪里jar文件?是否有模式可以找到它们的位置?
例如,foo/a/a.jar
和foo/b/b.jar
都在foo/
文件夹下,在这种情况下,您可以将find
与grep
一起使用:
find foo/ -name "*.jar" | xargs grep Hello.class
当然,至少你可以在根目录/
下搜索它们,但它会很慢。
正如@loganaayahee所说,你也可以使用命令locate
。 locate
使用索引搜索文件,因此速度会更快。但命令应该是:
locate "*.jar" | xargs grep Hello.class
因为你想搜索jar文件的内容。
通常,Java会存储在CLASS_PATH
等环境变量中查找jar文件的路径,我不知道这是不是你想要的。但是如果您的变量是这样的:CLASS_PATH=/lib:/usr/lib:/bin
,它使用:
来分隔路径,那么您可以使用此推荐来搜索类:
for P in `echo $CLASS_PATH | sed 's/:/ /g'`; do grep Hello.calss $P/*.jar; done
答案 1 :(得分:27)
大多数解决方案都直接使用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 {}'
答案 2 :(得分:4)
只需转到包含jar的目录并在命令下面插入:
find *.jar | xargs grep className.class
希望这有帮助!
答案 3 :(得分:2)
locate *.jar | grep Hello.class.jar
locate命令用于搜索特定文件的所有路径 并显示文件的完整路径。
例如
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
答案 4 :(得分:2)
Linux,演练以在众多广告罐中查找类文件。
转到包含下面的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
了解为什么发现这个有效:
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,这就是您想要的那个。
答案 5 :(得分:1)
使用deepgrep和deepfind。在基于debian的系统上,您可以通过以下方式安装它们:
sudo apt-get install strigi-utils
两个命令也搜索嵌套档案。在您的情况下,命令看起来像:
find . -name "*.jar" | xargs -I {} deepfind {} | grep Hello.class
答案 6 :(得分:0)
我使用过这个小片段。可能会变慢但每次都有效。
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
答案 7 :(得分:-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