別のプログラムの出力または終了コードに基づいて、find(1) の結果にファイルを含めたり除外したりする方法があるかどうか知りたいです。具体的には、正規表現に一致するファイルのみを返すように find(1) を実行できるようにしたいと考えています。
find(1) の出力を egrep にパイプすることでこれを実現できることはわかっていますが、すべてを find(1) 内で実行できるようにしたいと思います。
たとえば、次のコードをパイプなしで find(1) の単一の呼び出しに変換する方法はありますか?
find . [test] | xargs egrep -l [regex]
答え1
-exec
コマンドがゼロを返す場合 (成功)、"true" と評価されます。
find . -type f -exec egrep -qs "regex" {} \; -print
-print
選択したアクションに置き換えます。
しかし、この方法はegrep
一度だけ実行されるので、各ファイル。 比較する:
等しい ~/code $ time find -type f -exec grep -qs bin/env {} \; -print | wc -l 60 実数 0分0.760秒 ユーザー 0m0.104s システム 0分0.596秒
対
等しい ~/code $ time find -type f -print0 | xargs -0 egrep -l bin/env | wc -l 60 実数 0分0.021秒 ユーザー 0分0.003秒 システム 0分0.023秒
(比較的小さな Git リポジトリ (300 ファイル、約 2.6 MB) でテスト済み。)