web-dev-qa-db-fra.com

Linux cmd pour rechercher un fichier de classe parmi les fichiers JAR indépendamment du chemin d'accès au fichier JAR

Je souhaite rechercher un fichier de classe particulier parmi de nombreux fichiers JAR sans indiquer l'emplacement de chaque fichier JAR.

Est-ce possible avec une simple commande?

J'ai essayé cette commande:

grep Hello.class *.jar

Qui n'a pas renvoyé une liste de bocaux contenant la classe. Puis j'ai lancé la commande:

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

Ce qui a renvoyé le fichier jar correspondant. Y a-t-il un meilleur moyen?

45
AlwaysALearner

Où êtes-vous fichiers JAR? Y a-t-il un modèle pour trouver où ils sont?

1. Sont-ils tous dans le même répertoire?

Par exemple, foo/a/a.jar et foo/b/b.jar sont tous sous le dossier foo/, dans ce cas, vous pouvez utiliser find avec grep:

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

Bien sûr, vous pouvez au moins les rechercher dans le répertoire racine /, mais ce sera lent.

Comme @loganaayahee l'a dit, vous pouvez aussi utiliser la commande locate. locate cherche les fichiers avec un index, donc ce sera plus rapide. Mais la commande devrait être:

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

Puisque vous voulez rechercher le contenu des fichiers jar.

2. Les chemins sont-ils stockés dans une variable d’environnement?

Typiquement, Java stockera les chemins pour trouver les fichiers jar dans une variable d’environnement comme CLASS_PATH, Je ne sais pas si c'est ce que vous voulez. Mais si votre variable est juste comme ceci: CLASS_PATH=/lib:/usr/lib:/bin, qui utilise un : pour séparer les chemins, vous pouvez utiliser cette recommandation pour rechercher la classe:

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

La plupart des solutions utilisent directement la commande grep pour trouver la classe. Cependant, cela ne vous donnerait pas le nom du paquet de la classe. De plus, si le fichier jar est compressé, grep ne fonctionnera pas.

Cette solution utilise la commande jar pour répertorier le contenu du fichier et grep la classe que vous recherchez.

Il va imprimer la classe avec le nom du paquet et aussi le nom du fichier jar.

find . -type f -name '*.jar' -print0 |  xargs -0 -I '{}' sh -c 'jar tf {} | grep Hello.class &&  echo {}'

Vous pouvez également rechercher avec votre nom de paquet comme ci-dessous:

find . -type f -name '*.jar' -print0 |  xargs -0 -I '{}' sh -c 'jar tf {} | grep com/mypackage/Hello.class &&  echo {}'
28
Wenbing Li

Il suffit d'aller dans le répertoire qui contient les jars et d'insérer la commande ci-dessous:

find *.jar | xargs grep className.class

J'espère que cela t'aides!

4
tk_

Linux, Procédure pas à pas pour trouver un fichier de classe parmi de nombreux fichiers jar.

Allez dans le répertoire qui contient les pots en dessous.

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

Je cherche quel pot fournit pour la classe de producteur.

Comprendre le fonctionnement de la boucle 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

Comprendre pourquoi trouver cela fonctionne:

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

Vous pouvez pomper tous les pots sous la boucle:

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

Maintenant, nous pouvons opérer sur chacun d'eux:

Fait une jar tf sur chaque pot et le fourrer dans blah.txt:

for i in `find . -name "*.jar"`; do echo $i; jar tf $i; done > blah.txt

Inspectez blah.txt, c’est une liste de toutes les classes de tous les pots. Vous pouvez rechercher dans ce fichier la classe que vous voulez, puis rechercher le fichier jar qui l’a précédé, c’est celui que vous voulez.

2
Eric Leschinski
   locate *.jar | grep Hello.class.jar

La commande de localisation permet de rechercher tout le chemin du fichier et d'afficher le chemin complet du fichier.

exemple

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
2
loganaayahee

Utilisez deepgrep et deepfind. Sur les systèmes basés sur Debian, vous pouvez les installer en:

Sudo apt-get install strigi-utils

Les deux commandes recherchent également les archives imbriquées. Dans votre cas, la commande ressemblerait à ceci:

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

J'ai utilisé ce petit extrait. Peut-être plus lent mais fonctionne à chaque fois.

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
0
aayush singhal