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?
Où êtes-vous fichiers JAR? Y a-t-il un modèle pour trouver où ils sont?
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.
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
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 {}'
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!
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.
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
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
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