2017-10-11 8 views
2

「検索」の結果のために:だから私が行うことができますは、ループのために、私は、このコマンドを見つける必要があり、コマンド

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

を:

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

を私は上記の発見コマンドの結果ごとにこのコマンドを実行する必要がありますforループかどうか?私が必要とするものを実行する.shファイルを作成できますか? ありがとう!

+0

関連:https://stackoverflow.com/q/9612090/1531971 – jdv

+0

「RESULTPATH」は「findコマンドで特定された各ファイル」を意図していますか?また、 '.jar'ファイルはzipです。あなたは 'grep -z'を意味しますか?また、あなたの 'zip'行の引用符は何ですか? – ghoti

+0

はい、resultpathの場所は、findコマンドで見つかったパスでなければなりません。引用符がありません – user269721

答えて

0

grepコマンドには、2つの情報チャネルがあります。最初の最も明白なものはもちろん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がエラーなしで終了した場合にのみ、ファイルは2番目の-execに渡されます。

+0

ありがとうございました!あなたは私の命を救いました – user269721

2

xargsgrepコマンドの各結果に対応するコマンドを実行するためのクリーンな方法は、ヌルによって終了結果を作るためにgrep-Z又は--nullフラグを使用して、それが値を期待するようxargs-0フラグが終了しますヌルで、次のように:彼らはすべてご利用の場合には(有害でさえ)は無意味に見えるので

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

私はHlsフラグを削除しました。

しかし、私は.jarファイルは通常、バイナリファイル(Javaクラスのzip形式のアーカイブ)であるので、これは実際にあなたの場合、 のために動作しません怖い、 ので、私はgrepが今まで何も一致しないと思います。あなたはzgrepにjar内を検索しようとすることができます。

+0

ディレクトリにはまだプレーンテキスト名が含まれています。 – 123

関連する問題