質問: 組み合わせたコマンドを「find -exec」に渡すにはどうすればよいですか? -execオプションを使用して結合されたコマンドをfindに渡すための有効な構文は何ですか?例:find . -type f -name "*.txt" -exec grep firstkeyword {} | grep secondkeyword \; 次のエラーメッセージで失敗します。find: grep: missing argument to `-exec` ;: no such file or directory &&ではなく;または|を使用してコマンドを組み合わせると、同じ種類の障害が発生します。 'または$()または{}などで結合されたコマンドを引用してみましたが、(無残に)失敗しました。注:カスタムスクリプトを使用せずに、ワンライナーソリューションを探しています。
回答: あなたの具体的な例として、これを行うことができます:find . -type f -name "*.txt" -exec grep firstkeyword {} \; | grep "secondkeyword" ところで、これは2番目のgrepを使用せずに行うこともできます。代わりに、egrepを使用し、firstkeywordの後にsecondkeywordを続けるか、secondkeywordの後にfirstkeywordを続けます。find . -type f -name "*.txt" -exec egrep "firstkeyword.*secondkeyword|secondkeyword.*firstkeyword" {} \; findから得られるパス名についていくつかの保証を行うことができる場合(パス名に先行スペースも内部スペースも改行もないなど)、次のようにすることもできます。find . -type f -name "*.txt" -print | while read filename; do grep "firstkeyword" "${filename}" | grep "secondkeyword"; done より一般的な答えは、findから直接「できない」です。コマンドのパイピングまたは&&または||の使用は、シェルの機能であり、プロセスを実行する機能ではありません。私は以前このパターンを使用しましたが、それは壊れやすく、より複雑です:find . -type f -name "*.txt" -print \ | sed -e 's;[\\$"`!];\\&;g' \ -e 's;^.*$;grep "firstkeyword" "&" | grep "secondkeyword";' \ | sh 各ファイル名を出力し、sedを使用してその場でシェルスクリプトに変換し(シェルの二重引用符で囲むと問題が発生する可能性があるファイル名の文字をエスケープしないように注意)、結果を実行します。シェル。他の解決策は、処理を実行するシェルスクリプトを作成し、そのシェルスクリプトをfindから呼び出すことです。$ cat grepit.sh #!/bin/sh grep "firstkeyword" "$1" | grep "secondkeyword" $ find . -type f -name "*.txt" -exec sh grepit.sh {} \;