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
...)通常、これは行われません。