My use case is I want to search a collection of JARs for a specific class file. More specifically, I want to search recursively within a directory for all *.jar files, then list their contents, looking for a specific class file.
So this is what I have so far:
find . -name *.jar -type f -exec echo {} \; -exec jar tf {} \;
This will list the contents of all JAR files found recursively. I want to put a grep
within the seconed exec
because I want the second exec
to only print the contents of the JAR that grep
matches.
If I just put a pipe and pipe it all to grep afterward, like:
find . -name *.jar -type f -exec echo {} \; -exec jar tf {} \; | grep $CLASSNAME
Then I lose the output of the first exec
, which tells me where the class file is (the name of JAR file is likely to not match the class file name).
So if there was a way for the exec
to run two commands, like:
-exec "jar tf {} | grep $CLASSNAME" \;
Then this would work. Using a grep $(...)
in the exec
command wouldn't work because I need the {}
from the find
to take the place of the file that was found.
Is this possible? (Also I am open to other ways of doing this, but the command line is preferred.)