最初の一致後にfindコマンドをどのように停止できますか?

最初の一致後にfindコマンドをどのように停止できますか?

find最初の一致を見つけた後にコマンドを強制的に停止する方法はありますか?

ベストアンサー1

GNUまたはFreeBSDの場合は述語をfind使用できます-quit

find . ... -print -quit

NetBSDにfind対応:

find . ... -print -exit

名前だけを印刷し、ファイル名に改行文字が含まれていないと仮定すると、次のことができます。

find . ... -print | head -n 1

これは最初のゲーム以降は停止しませんがfind、2番目のゲームのタイミングとバッファリングによって、または(ずっと)後で停止することもできます。デフォルトでは、何かを出力しよfindうとするとSIGPIPEで終了し、head入力の最初の行を読んで表示したため、すでに終了しています。

findこのコマンドが返された後、すべてのシェルが待機するわけではありませんhead。 BourneシェルおよびAT&T実装ksh(非対話型の場合)およびyash(パイプがスクリプトの最後のコマンドである場合にのみ)バックグラウンドで実行されません。どのシェルでもこの​​動作を確認するには、いつでも上記の内容を次のように変更できます。

(find . ... -print &) | head -n 1

見つかったファイルのパスを印刷する以外の操作を実行するには、次のことを試すことができます。

find . ... -exec sh -c 'printf "%s\n" "$1"; kill -s PIPE "$PPID"' sh {} \;

printfファイルに必要なものに置き換えます)。

findこれには終了ステータスを返す副作用があり、終了ステータスを反映しています。

パイプラインの一部が信号によって終了したときに一部のシェルが表示するメッセージを避けるために、デフォルトのSIGTERM信号の代わりにSIGPIPE信号を送信します。 SIGPIPEによる死亡は自然に発生するため(上​​記のようにfind | head...)通常、これは行われません。

おすすめ記事