このコマンドを使用して、* .jarファイルからJavaクラスを検索し、これらのクラスを含むjarの名前のみを取得します。
grep -ral --include=*.jar SignonEJB .
出力からクラス名をどのように取得できますか?
答え1
ファイル名のみがリストされていること-l
を示すには、このオプションを渡します。grep
これはファイルの名前であり、.jar
他のファイルは関連しません。
クラス名を出力するにはgrep
それを削除する必要があります-l
。しかし、jarはバイナリファイルであり、行で構成されていないため、同じ「行」に他の多くのゴミが印刷されます。 (GNU grepを使用すると、-a
「binary ... match」だけでなく、その出力を取得するには渡す必要があります。)
GNU grep を使用すると、クラス名全体を一致させて-o
出力に渡すことができます。
grep -rao --include='*.jar' '[0-9A-Z_a-z]*SignonEJB[0-9A-Z_a-z]*' .
それともこのパッケージも欲しいなら
grep -rao --include='*.jar' '[$./0-9A-Z_a-z]*SignonEJB[0-9A-Z_a-z]*' .
strings
別のアプローチは、まずファイルを実行して印刷可能な文字列を抽出することです。 (2つのコマンドは同じです。sedバージョンはブロックし\&
てラップしますが、awkバージョンはすべての文字をサポートします。)
find . -name '*.jar' -exec sh -c 'strings "$0" | grep SignonEJB | sed "s&^&$0&"' {} \;
find . -name '*.jar' -exec sh -c 'strings "$0" | jar=$0 awk "/SignonEJB/ {print ENVIRON[\"jar\"] \":\" $0}"' {} \;
または(厳密に言えば、を使用するとgrep
偽の肯定が発生する可能性が少なくても、より安定している場合)、unzip
ファイル名をリストしてフィルタリングすることを使用します。
find . -name '*.jar' -exec sh -c 'unzip -l -- "$0" | grep SignonEJB' {} \;
答え2
たぶん(GNUツールを使って):
grep -ralZ --include='*.jar' SignonEJB . |
xargs -r0IJ unzip -l J '*SignonEJB*.class'
あるいは、より安定して出力を読みやすくすることもできます。
find . -name '*.jar' -exec sh -c 'export i; for i do
zipinfo -1 "$i" | awk '\''/SignonEJB.*\.class$/{
print ENVIRON["i"] ": " $0}'\''; done' sh {} +