find
を強制する方法はありますか 最初の一致を見つけた直後に停止するコマンド?
承認された回答:
GNUまたはFreeBSDのfind
、-quit
を使用できます 述語:
find . ... -print -quit
NetBSDのfind
同等:
find . ... -print -exit
名前を印刷するだけで、ファイル名に改行文字が含まれていないと仮定すると、次のことができます。
find . ... -print | head -n 1
find
は停止しません 最初の試合の後、しかしおそらく、2番目の試合時または(ずっと)後のタイミングとバッファリングに依存します。基本的に、find
head
中に何かを出力しようとすると、SIGPIPEで終了します。 入力の最初の行をすでに読み取って表示しているため、すでに表示されていません。
すべてのシェルがそのfind
を待機するわけではないことに注意してください head
の後のコマンド 帰りました。 ksh
のBourneシェルとAT&Tの実装 (非対話型の場合)およびyash
(そのパイプラインがスクリプトの最後のコマンドである場合のみ)そうではなく、バックグラウンドで実行されたままになります。いずれかのシェルでその動作を確認したい場合は、いつでも上記を次のように変更できます。
(find . ... -print &) | head -n 1
見つかったファイルのパスを印刷する以上のことをしている場合は、次の方法を試すことができます。
find . ... -exec sh -c 'printf "%sn" "$1"; kill "$PPID"' sh {} ;
(printf
を置き換えます そのファイルで何をするにしても)
これには、find
の副作用があります ただし、強制終了されたという事実を反映して終了ステータスを返します。
実際には、SIGTERMの代わりにSIGPIPEシグナルを使用しています(kill -s PIPE
kill
の代わりに )一部のシェルはその死についてより沈黙します(ただし、ゼロ以外の終了ステータスを返します)。