20

コマンドを実行したい

find some/path -exec program \{} \; 

しかし、コマンドが終了したらすぐにfindコマンドを終了させたい

 program \{}

見つかったファイルのいずれかで失敗します。

これを行う簡単な方法はありますか?

4

5 に答える 5

7

他の素晴らしい答えに加えて、GNU find (少なくとも) には次の-quit述語があります。

find path -other -predicates \( -exec cmd {} \; -o -quit \)

-quit述語は確かに非標準であり、BSD find には存在しません。

于 2013-02-14T12:24:00.627 に答える
1

これは、最初のコンパイラエラーが発生した後に停止する「ビルドシステム」の例です(Kojiroの回答に基づいており、正確には機能しませんでした):

(エスケープされた括弧の必要性は現実です。私はそれが痛いことを知っています。)

find -name '*.cpp' \( -print -a -exec g++ -c {} \; -o -quit \)

現在のディレクトリ以下にある基本的にすべての C++ ファイルの静的ライブラリを構築したいと考えています。

-printコンパイラを実行する前に、ファイルを -ed にしてから -ed にしたいのですが、-exec失敗すると (そしてエラーが残る場合stderr-quit.

-aは、シェルまたは Cのようなものです&&-o||

かっこがない場合、GNU find は、最も可能性の高い条件を最初に試すことにより、クエリを「最適化」します-quit

于 2014-03-05T10:04:07.967 に答える
1

findからの出力を別のサブプロセスにパイプして、while/を使用できbreakます。

find some/path | while read f
do
    program $f
    if [ $? -ne 0 ]
    then
        break
    fi
done
于 2013-02-14T09:36:05.127 に答える
0
% _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}\" "{}" +
于 2013-12-07T21:46:31.697 に答える