Linux cmd在jar中搜索类文件而不管jar路径

Alw*_*ner 45 linux command

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

这可以用简单的命令吗?

我试过这个命令:

grep Hello.class *.jar
Run Code Online (Sandbox Code Playgroud)

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

grep Hello.class /full/path/of/jar/file/*.jar
Run Code Online (Sandbox Code Playgroud)

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

Bin*_*ang 84

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

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

例如,foo/a/a.jar并且foo/b/b.jar是所有的文件夹下foo/,在这种情况下,你可以使用findgrep:

find foo/ -name "*.jar" | xargs grep Hello.class
Run Code Online (Sandbox Code Playgroud)

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

正如@loganaayahee所说,您也可以使用该命令locate.locate使用索引搜索文件,因此速度会更快.但命令应该是:

locate "*.jar" | xargs grep Hello.class
Run Code Online (Sandbox Code Playgroud)

因为您要搜索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
Run Code Online (Sandbox Code Playgroud)


Wen*_* Li 28

大多数解决方案都是直接使用grep命令来查找类.但是,它不会为您提供该类的包名称.如果罐子被压缩,grep也行不通.

此解决方案使用jar命令列出文件的内容和grep您要查找的类.

它将使用包名称jar文件名打印出.

find . -type f -name '*.jar' -print0 |  xargs -0 -I '{}' sh -c 'jar tf {} | grep Hello.class &&  echo {}'
Run Code Online (Sandbox Code Playgroud)

您也可以使用下面的包名搜索:

find . -type f -name '*.jar' -print0 |  xargs -0 -I '{}' sh -c 'jar tf {} | grep com/mypackage/Hello.class &&  echo {}'
Run Code Online (Sandbox Code Playgroud)

  • +1有时罐子被压缩,grep将不起作用. (6认同)

tk_*_*tk_ 5

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

find *.jar | xargs grep className.class
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!