2011-10-14 40 views
18

我正在搜索一堆jar文件中的.class文件。多個jar文件的列表內容

jar tf abc.jar 

適用於一個文件。我試過

find -name "*.jar" | xargs jar tf 

什麼都沒打印。我能想到的唯一解決方案是解壓所有,然後搜索。有沒有更好的辦法?我在LUnix上。

編輯: 當掃描很多jar文件時,將jar文件名與類一起打印很有用。這種方法適用:

find . | grep jar$ | while read fname; do jar tf $fname | grep SchemaBuilder && echo $fname; done 

樣本輸出產生:

1572 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$1.class 
    1718 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$2.class 
42607 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder.class 
./XmlSchema-1.3.2.jar 
    1572 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$1.class 
    1718 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$2.class 
42607 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder.class 
./XmlSchema.jar 
+5

你的編輯正是我正在尋找。謝謝 – Lucas

回答

31

你需要傳遞-n 1xargs,迫使它爲它從find獲取每個文件名單獨運行jar命令:

find -name "*.jar" | xargs -n 1 jar tf 

否則xargs的命令行看起來像jar tf file1.jar file2.jar...,後者具有不同意思是什麼意圖。

一個有用的調試技術是堅持echo前,向xargs運行命令:

find -name "*.jar" | xargs echo jar tf 

這將打印出完整的jar命令,而不是執行它,這樣就可以看到什麼地方錯了。

+6

優秀的提示與「回聲」 – im8bit

+0

謝謝。這節省了很多時間 –

+0

你可以修改命令find -name「* .jar」| xargs -n 1 jar tf顯示正在顯示哪個文件的內容? –

-1

如果您使用的是Eclipse,你可以創建一個項目並添加所有的罐子。然後你就可以在任何一個罐子裏找到一堂課。

1

您還可以使用的-exec選項找到

find . -name "*.jar" -exec jar tf {} \; 
0

您還可以使用解壓縮比罐子來得更快(-l選項打印拉鍊內容)。

舉例來說,一個小腳本,你想要什麼,做大致爲:

#!/bin/bash 

for i in $(find . -name "*.jar") 
do 
    if [ -f $i ] 
then 
    echo $i 
    unzip -l $i | grep $* 
fi 
done 
1

這是我在Cygwin中使用。它按照上面的要求支持每個jar文件的部分頭文件。

find . -name "*.jar" \ 
-exec echo ======\ {}\ ====== \; \ 
-exec /c/Program\ Files/Java/jdk1.7.0_45/bin/jar.exe tf {} \; | less 

對於* nix中,刪除名爲「.exe」:

find . -name "*.jar" \ 
-exec echo ======\ {}\ ====== \; \ 
-exec jar tf {} \; | less 
1

我遇到類似的情況,我需要在當前目錄中的jar文件列表來搜索類。我也想知道這個類屬於哪個jar文件。我使用了下面的代碼片段(shell腳本),發現它很有用。下面的腳本將列出包含要搜索的類的jar文件。

#!/bin/sh 
LOOK_FOR="codehaus/xfire/spring" 
for i in `find . -name "*jar"` 
do 
    echo "Looking in $i ..." 
    jar tvf $i | grep $LOOK_FOR > /dev/null 
    if [ $? == 0 ] 
    then 
    echo "==> Found \"$LOOK_FOR\" in $i" 
    fi 
done 
取自

shell腳本: http://alvinalexander.com/blog/post/java/shell-script-search-search-multiple-jar-files-class-pattern

+0

請嘗試添加更多的上下文,而不僅僅發佈鏈接,因爲它可能在將來變陳舊。 – mjuarez

+0

感謝您的投入piet.t @和mjuarez @。相應地更新我的答案。隨時提供您的輸入。謝謝! –

+0

不知道爲什麼這麼慢? –

0

我不認爲有必要使用EXEC,這爲我工作在Cygwin的Windows上:

find . -name "*.jar" | while read jarfile; do unzip -l $jarfile | fgrep "foo" ; done