Javaクラスを含むJARを見つけようとします。 JARはzip形式です。
私の最初の試みは次のとおりです。
$ find -name "*3.0.6.RELEASE.jar" | xargs -l1 unzip -l \
| grep stereotype.Controller
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
クラスが見つかりましたが、25個の一致するファイルのうち、どのファイルにそのクラスが含まれているかはまだわかりません(このクラスを含む2つのJARがあります)。それでtee
中間を利用してファイル名を出力してみようと思いました。
$ find -name "*3.0.6.RELEASE.jar" | tee - | xargs -l1 unzip -l \
| grep stereotype.Controller
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
ファイル名の後に、Controller.class(一致するファイルの場合)と次のファイル名(数学でない場合)が表示されると予想しました。しかし、今考えてみると、標準出力はパイプに流れ、xargsによって処理されるので、これは意味があります。
標準エラーを使用することもできますが、プロセスが同時に実行されるため、出力が私が見たい順序ではないタイミングの問題がある可能性があると思います。
もしそうなら、この問題を解決するより良い方法があります。誰にもアイデアはありますか?
修正する:答えを待っている間、私はそのトリックを実行する恐ろしいPerl one linerを書いていましたが、よりエレガントなソリューションを期待しています。
$ find -name "*3.0.6.RELEASE.jar" | perl -e 'while (<>) { \
$file=$_; @class=`unzip -l $_`; foreach (@class) { \
if (/stereotype.Controller/) {print "$file $_";} } }'
出力:
./spring-context/3.0.6.RELEASE/spring-context-3.0.6.RELEASE.jar
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
./org.springframework.context/3.0.6.RELEASE/org.springframework.context-3.0.6.RELEASE.jar
554 2011-08-18 16:49 org/springframework/stereotype/Controller.class
ベストアンサー1
この試み:
find -name "*3.0.6.RELEASE.jar" -exec sh -c 'unzip -l "{}" | grep -q stereotype.Controller' \; -print
xargs
これにはforやループは必要ありませんfor
。これはすべてを介して行うことができますfind
。 grepの内容も出力したい場合は削除してください-q
。grep
ただし、grep
一致が表示されることに注意してください。今後各ファイル名。よりきれいな出力のために-exec echo \;
最後に追加できます。