コマンドを実行したい
find some/path -exec program \{} \;
しかし、コマンドが終了したらすぐにfindコマンドを終了させたい
program \{}
見つかったファイルのいずれかで失敗します。
これを行う簡単な方法はありますか?
他の素晴らしい答えに加えて、GNU find (少なくとも) には次の-quit
述語があります。
find path -other -predicates \( -exec cmd {} \; -o -quit \)
-quit
述語は確かに非標準であり、BSD find には存在しません。
これは、最初のコンパイラエラーが発生した後に停止する「ビルドシステム」の例です(Kojiroの回答に基づいており、正確には機能しませんでした):
(エスケープされた括弧の必要性は現実です。私はそれが痛いことを知っています。)
find -name '*.cpp' \( -print -a -exec g++ -c {} \; -o -quit \)
現在のディレクトリ以下にある基本的にすべての C++ ファイルの静的ライブラリを構築したいと考えています。
-print
コンパイラを実行する前に、ファイルを -ed にしてから -ed にしたいのですが、-exec
失敗すると (そしてエラーが残る場合stderr
は-quit
.
-a
は、シェルまたは Cのようなものです&&
。-o
||
かっこがない場合、GNU find は、最も可能性の高い条件を最初に試すことにより、クエリを「最適化」します-quit
。
find
からの出力を別のサブプロセスにパイプして、while
/を使用できbreak
ます。
find some/path | while read f
do
program $f
if [ $? -ne 0 ]
then
break
fi
done
% _find_trap() {
> _find_pid="${1}" ; _find_ops="${2}" ; _find_trigger="${3}"
> shift 3 && set -- "${@}"
> trap 'kill -s INT "-${_find_pid}" \
> unset _find_pid _find_ops _find_trigger ; set - \
> 1>&2 printf "%s" "find killed due to trap" \
> exit [CODE] ' TRAP
> while { sh -c "${_find_ops} ${@}"} {
> [ "${_find_trigger}" ] && { kill -s TRAP "-${_find_pid}" ; break ; }
> ...
> }
> export -f _find_trap ; find . -execdir _find_trap \"$$\" \"${cmds}\" \
> \"${testable_trigger}\" "{}" +