Bash

使用 find、unzip、grep 在一組 JAR 中查找 Java 類

  • October 13, 2015

我試圖找到包含 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

這裡不需要 forxargsfor循環。一切都可以用一個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內容之後

引用自:https://unix.stackexchange.com/questions/25503