2015-10-16 71 views
0

這看起來像一個簡單的bash任務,但我無法弄清楚如何去做。在這個特定的實例中,它是關於jar命令的,但同樣適用於tar命令。從bash搜索jar或tar

夠成立,這裏的問題:

我用下面的bash命令到一個罐子內搜索文件:

jar -tf com.my.jarfile.jar | grep some_search_text 

夠簡單。現在,我有一個jar文件的目錄,我真正想要的是一個命令,它可以告訴我哪些jar包含名稱包含給定字符串的文件。這可能嗎?

背景問題:我有一個文件在我的項目中通過幾個jar文件意外擴散。我想確定哪些jar文件包含這個文件。上面的命令有點不同,它會從jar中輸出與該模式匹配的文件。我不太瞭解jar中匹配文件的名稱,因爲我只是哪些jar包含匹配項。

+1

你的命令查找的是jar文件中包含'some_search_text'的文件名。你正在尋找包含字符串的jar文件,還是包含文件名包含字符串的文件的jar文件?處理是完全不同的。 –

+0

如果您正在尋找一種解決方案,以遞歸方式在jar文件中查找**文件名**,您可以查看此shell腳本作爲起點:https://github.com/afester/CodeSamples/blob/ master/Shell/bash/grepJar –

+0

感謝您指出含糊之處。我正在尋找後者,任何包含名稱包含字符串的文件的jar文件。 – Denial

回答

1

假設你有興趣,其中包含該文件名的目標字符串相匹配文件的jar文件,你可以寫一個簡單的循環:

search="some_search_text" 
for file in *.jar 
do 
    echo "$file" 
    jar -tf "$file" | grep -e "$search" 
done 

這一唱一和的JAR文件的名稱,然後如果該jar文件包含一個名稱與搜索字符串匹配的文件,該文件將被顯示。 -e確保即使您的搜索字符串以破折號開頭,也不會造成混淆。

如果你不想不匹配的名稱出現,則:

search="some_search_text" 
for file in *.jar 
do 
    match=$(jar -tf "$file" | grep -e "$search") 
    if [ -n "$match" ] 
    then 
     echo "$file" 
     echo "$match" 
    fi 
done 

如果你只是想jar文件名出現,如果它包含名稱相匹配的文件,然後(很明顯):

search="some_search_text" 
for file in *.jar 
do 
    match=$(jar -tf "$file" | grep -e "$search") 
    if [ -n "$match" ] 
    then 
     echo "$file" 
    fi 
done 

雖然可以縮小到:

search="some_search_text" 
for file in *.jar 
do 
    [ -n "$(jar -tf "$file" | grep -e "$search")" ] && echo "$file" 
done 

兩個罐子和焦油COMM並根據調用處理其中一個文件;沒有辦法讓一個調用過程處理多個文件。

如果你在jar文件很感興趣,其中jar文件包含符合您的搜索文本任何東西,那麼你可以使用:

search="some_search_text" 

grep -e "$search" -l *.jar 

-l列出的jar文件的名字。儘管典型的jar文件包含二進制數據,但它仍能正常工作。

+0

最後發現你簡單的grep命令足以讓我得到答案。上面的循環肯定會派上用場,並且更準確地解決所述的問題。謝謝! – Denial

+0

當我接受這條消息時,你的最新更新沒有出現。請考慮這個評論第二個upvote。 – Denial