AlwaysALearner AlwaysALearner - 6 months ago 19
Linux Question

Linux cmd to search for a class file among jars irrespective of jar path

I want to search for a particular class file among many jar files without giving the location of each jar file.

Is this possible with a simple command?

I tried this command:

grep Hello.class *.jar


Which did not return a list of jars containing the class. Then I ran the command:

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


Which did return the relevant jar file. Is there a better way?

Answer

Where are you jar files? Is there a pattern to find where they are?

1. Are they all in one directory?

For example, foo/a/a.jar and foo/b/b.jar are all under the folder foo/, in this case, you could use find with grep:

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

Sure, at least you can search them under the root directory /, but it will be slow.

As @loganaayahee said, you could also use the command locate. locate search the files with an index, so it will be faster. But the command should be:

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

Since you want to search the content of the jar files.

2. Are the paths stored in an environment variable?

Typically, Java will store the paths to find jar files in an environment variable like CLASS_PATH, I don't know if this is what you want. But if your variable is just like this:CLASS_PATH=/lib:/usr/lib:/bin, which use a : to separate the paths, then you could use this commend to search the class:

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