Linux的cmd以寻找罐子不论罐子路径中一个类文件(Linux cmd to search for

2019-08-07 03:25发布

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

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

我想下面的命令:

grep Hello.class *.jar

这没有返回包含类罐子的列表。 然后我跑的命令:

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

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

Answer 1:

你是哪里的jar文件? 有没有发现,他们是一个模式?

1.他们全部在一个目录?

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

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

当然,至少你可以搜索他们的根目录下的/ ,但是这将是缓慢的。

作为@loganaayahee说,你也可以使用命令locatelocate搜索与索引文件,因此它会更快。 但命令应该是:

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

既然你要搜索的jar文件的内容。

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

通常情况下,Java将存储的路径找到像一个环境变量的jar文件CLASS_PATH ,我不知道这是不是你想要的。 但是,如果你的变量就像这样: CLASS_PATH=/lib:/usr/lib:/bin ,其使用:在路径分开,那么你可以使用这个表彰搜索类:

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


Answer 2:

大多数解决方案都直接使用grep命令来查找类。 但是,它不会给你的类的包名。 此外,如果罐子被压缩, 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 {}'


Answer 3:

只要到其中包含罐子的目录,并插入下面的命令:

find *.jar | xargs grep className.class

希望这可以帮助!



Answer 4:

Linux的演练就可以找到很多罐子中的类文件。

转到包含下面的罐子的目录。

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提供了制作类。

了解如何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文件的列表。 你可以搜索你想要的,然后寻找它之前的罐子的类文件,这就是你想要的。



Answer 5:

   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


Answer 6:

deepgrep和deepfind使用。 在基于Debian的系统,您可以通过安装它们:

sudo apt-get install strigi-utils

这两个命令搜索嵌套压缩文件也是如此。 在你的情况下,命令如下所示:

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


Answer 7:

我已经使用这个小片段。 可能是慢,但屡试不爽。

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


Answer 8:

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


文章来源: Linux cmd to search for a class file among jars irrespective of jar path
标签: linux command