このコマンドを使用して、* .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' {} \;