見つけるために-exec引数としてパイプ

見つけるために-exec引数としてパイプ

-execfindオプションの引数としてパイプコマンドを使用できますか?つまり、次のようなことをしたいのです。

find . -name CMakeLists* -exec cat '{}' | grep lib \;

各ファイルについて試しましたが、うまくcat '{}' | grep libいきません。引用符も機能しません。誰にも提案がありますか?

修正する:

具体的な質問に対する回答が完了しました。今、ユニバーサルパターンを操作する方法はありますかfind <path> -type f -name <name> -exec <pipeline-command>

答え1

find . -type f -name "CMakeLists*" -exec grep lib /dev/null {} +

この発見文書現在のディレクトリでは、デフォルト名は文字列またはで始まりますCMakeLists。引数findは、実行前にシェルが引数を拡張しないようにエスケープされます(二重引用符)。

catパイプを追加する必要はありませんgrep。ここでは、無駄なIOを持つ無駄なプロセスです。一致するファイルが複数ある場合、ファイル名が一致する行と一緒に報告されるように/dev/null追加されました。grep

{} +複数のファイル名は、引数として使用される終了シーケンスを介して各コマンド呼び出し-execに渡されます。grep私たちが{} \;使うならgrepすべてファイルが見つかりました。不要なプロセスのインスタンス化を数百または数千回実行すると、費用がかかります。

パラメーター付きパイプを使用するには、find -execシェルを呼び出す必要があります。人為的な例として、grep文字列 "one" がありますが、文字列 "two" も存在しない場合にのみ該当します。これは次のように行うことができます。

find . -type f -name "CMakeLists*" -exec sh -c 'grep one "$@"|grep -v two' sh {} +

これは、以下の@muru、@Serg、および@Scottのコメントに基づいて書かれています。ありがとうございます。

答え2

まず、これはfindコマンドが終了する方法ではありません。

第二に、catに直接置き換えることができますgrep lib

find . -name CMakeLists* -exec grep lib '{}' \;

これは基本的にすべての検索結果で「grep lib」を意味します。 {} 周囲のチェックマークを省略することもできます。動作する必要があります。

関連情報