-exec
findオプションの引数としてパイプコマンドを使用できますか?つまり、次のようなことをしたいのです。
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」を意味します。 {} 周囲のチェックマークを省略することもできます。動作する必要があります。