Bash
使用 find、unzip、grep 在一組 JAR 中查找 Java 類
我試圖找到包含 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 個匹配文件中的哪個包含它(有兩個 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 單行程式碼來解決問題,但期待看到更優雅的解決方案。
$ 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
嘗試這個:
find -name "*3.0.6.RELEASE.jar" -exec sh -c 'unzip -l "{}" | grep -q stereotype.Controller' \; -print
這裡不需要 for
xargs
或for
循環。一切都可以用一個find
. 如果您還想輸出 grepped 的內容,只需刪除-q
選項grep
- 但請注意grep
匹配項將出現在每個文件名之前。為了更清晰的輸出,您可以-exec echo \;
在最後添加。
在您的第一個單行中,在
grep
命令中添加-H
選項。即在結果中包含文件名。這是來自手冊頁 -
-H, --with-filename Print the filename for each match.</strike>
更新
可能這個腳本會有所幫助 -
#!/bin/bash searchSTR="YOUR SEARCH" for i in `find . -name "*jar"` do echo "Scanning $i ..." jar tvf $i | grep $searchSTR > /dev/null if [ $? == 0 ] then echo "==> Found \"$searchSTR\" in $i" fi done
單線:
for i in `find . -name "*.jar"`; do jar tvf $i | grep "search pattern" && echo $i ; done
唯一可悲的是jar文件的名稱會顯示在
grep
內容之後