プログラムに基づいて Unix の find コマンドからファイルを除外/含める

プログラムに基づいて Unix の find コマンドからファイルを除外/含める

別のプログラムの出力または終了コードに基づいて、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) でテスト済み。)

関連情報