2013-02-14 5 views
15

のいずれかのファイルに障害が発生したが、私はfindコマンドは、コマンド<p>は見つかったファイルで失敗します。</p> <p>これを行う簡単な方法はありますか?あなたが別のサブプロセスへのパイプ<code>find</code>からの出力を可能性があり、使用</p>

program \{} 
とすぐに終了したい場合は-exec見つけるから終了するにはどのよう
+0

関連:http://unix.stackexchange.com/questions/62880/how-to-stop-the-find-command-after-first-match – kojiro

答えて

1

while/break

find some/path | while read f 
do 
    program $f 
    if [ $? -ne 0 ] 
    then 
     break 
    fi 
done 
+1

「if!」を実行する方が良いでしょう。プログラム$ f;それから...また、 '-print0'とread -d"を使って改行の代わりにNULを区切ることもできます。これはより安全です。 – kojiro

+1

この変形は、ファイルにスペースが含まれている場合に重要な@kojiroの安全上の提案を適用します。そのためには '$ f'を引用符で囲む必要があります。 (また、bash固有の '$ '''を使用していることに注意してください)。それも小さいです: 'find path -print0 |読んでいる間は-d $ '\ 0' f;コマンド "$ f"を実行します。ブレーク; done' – darque

2

私はそれだけでfind -execで、あなたが望むものを達成することは不可能だと思います。

最も近い選択肢は次のように、xargsにパイプfindを行うには、次のようになります。

find some/path -print0 | xargs -0 program 

または

find some/path -print0 | xargs -0L1 program 

プログラムがゼロ以外の終了ステータスで終了した場合にこれが終了します

  • print0が使用されているため、名前は
  • -0を扱うことができ-print0L1
  • を使用した場合に必要な
(デフォルトはプログラムの単一の実行中にすべての引数を追加することです)一度に一つの引数を指定してプログラムを実行する xargsプログラムに指示します

あなたが唯一のまともなファイル名を持っている場合、あなたはこのように単純化することができます。

find some/path | xargs program 

または

find some/path | xargs -L1 program 

最後に、programに引数が複数指定されている場合は、-i{}を組み合わせて使用​​できます。例えば。他の細かい回答に加え

find some/path | xargs -i program param1 param2 {} param4 
4

、GNUは、(少なくとも)を見つける-quit述語を有する:

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

-quit述語はcertainly non-standardあり、BSDの検索には存在しません。

(の必要性:ここで

+2

これは私が必要とするものに近いですが、これが失敗した場合は終了しないで終了する必要があります(述語の第2部分)。 – Lucas

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}\" "{}" + 
0

は(私のためexacltyの仕事をしませんでした小次郎の回答に基づいて)最初のコンパイラエラー を打った後停止し、「ビルドシステム」、のための私の例であります括弧がエスケープされているのは本当です。私はそれが痛いことを知っています。)

現在のディレクトリ以下にある基本的にすべてのC++ファイルの静的ライブラリを構築したいと考えています。私は、ファイル-print -edを持ちたいコンパイラを実行する前に

、その後-exec -edが、それは(を失敗し、stderrのエラーを離れるとき、それが必要-quit

-a&&-oのようなものは次のようです括弧なしのシェルまたはC.

||、GNUがある、最初の最も可能性の条件を試みることによって、クエリを「最適化」を見つける - 私は推測する - 。-quit

関連する問題

 関連する問題