2017-10-11 107 views
2

我有這個find命令:for循環的結果, 「查找」 命令

$ find . -name '*.jar' -exec grep -Hls BuildConfig {} \; 

我需要爲命令的每個結果執行這個命令可以找到以上:

$ zip -d RESULTPATH "*/BuildConfig.class" 

所以我可以做這與循環或不循環?我可以創建.sh文件來做我需要的嗎? 謝謝!

+0

相關:https://stackoverflow.com/q/9612090/1531971 – jdv

+0

RESULTPATH旨在成爲「find命令」所標識的每個文件嗎?另外,'.jar'文件是一個zip文件。你的意思是'grep -z'?另外,你的'zip'行上的引號是什麼? – ghoti

+0

是的,在resultpath的位置必須是find命令找到的路徑。缺少引號 – user269721

回答

0

grep命令有兩個通道用於輸出信息。第一個也是最明顯的一個當然是stdout,它發送它找到的匹配。但是,如果它發現沒有匹配,它也使用退出值> 0來通知您。與-q(安靜)選項結合使用時,可以將它作爲一個更智能的選項find

$ find . -name '*.jar' -exec zgrep -sq BuildConfig {} \; -exec zip -d {} "*/BuildConfig.class" \; 

這是假設你想通過使用grep -Z,當然壓縮文件進行搜索。 :)

或者以方便您閱讀:

find . -name '*.jar' \ 
    -exec zgrep -sq BuildConfig {} \; \ 
    -exec zip -d {} "*/BuildConfig.class" \; 

查找,以便在每次測試運行。您可以將這些選項看作一系列過濾器; -name選項是第一個過濾器,並且如果先前的-exec沒有錯誤退出,則文件只會傳遞到第二個-exec

+0

謝謝!你救了我的命 – user269721

2

乾淨的方式來運行一個grep命令的每個結果將命令與xargs,使用-Z--null標誌與grep使由空終止的結果,並且-0標誌與xargs使得它預計值終止通過空,像這樣:

find . -name '*.jar' -exec grep -Z BuildConfig {} \; | xargs -0 zip -d RESULTPATH "*/BuildConfig.class 

我刪除了Hls標誌,因爲他們似乎都在你的使用情況毫無意義的(甚至是有害的)。

但我怕這會不會實際上是爲你工作的情況下, 因爲.jar文件通常是一個二進制文件(Java類的壓縮文檔), 所以我不認爲grep永遠不會匹配任何內容。您可以嘗試在罐子內搜索zgrep

+0

它仍然會包含目錄的純文本名稱。 – 123