のいずれかのファイルに障害が発生したが、私はfindコマンドは、コマンド<p>は見つかったファイルで失敗します。</p> <p>これを行う簡単な方法はありますか?あなたが別のサブプロセスへのパイプ<code>find</code>からの出力を可能性があり、使用</p>
program \{}
とすぐに終了したい場合は-exec見つけるから終了するにはどのよう
のいずれかのファイルに障害が発生したが、私はfindコマンドは、コマンド<p>は見つかったファイルで失敗します。</p> <p>これを行う簡単な方法はありますか?あなたが別のサブプロセスへのパイプ<code>find</code>からの出力を可能性があり、使用</p>
program \{}
とすぐに終了したい場合は-exec見つけるから終了するにはどのよう
while
/break
:
find some/path | while read f
do
program $f
if [ $? -ne 0 ]
then
break
fi
done
「if!」を実行する方が良いでしょう。プログラム$ f;それから...また、 '-print0'とread -d"を使って改行の代わりにNULを区切ることもできます。これはより安全です。 – kojiro
この変形は、ファイルにスペースが含まれている場合に重要な@kojiroの安全上の提案を適用します。そのためには '$ f'を引用符で囲む必要があります。 (また、bash固有の '$ '''を使用していることに注意してください)。それも小さいです: 'find path -print0 |読んでいる間は-d $ '\ 0' f;コマンド "$ f"を実行します。ブレーク; done' – darque
私はそれだけでfind -exec
で、あなたが望むものを達成することは不可能だと思います。
最も近い選択肢は次のように、xargs
にパイプfind
を行うには、次のようになります。
find some/path -print0 | xargs -0 program
または
find some/path -print0 | xargs -0L1 program
プログラムがゼロ以外の終了ステータスで終了した場合にこれが終了します
print0
が使用されているため、名前は-0
を扱うことができ-print0
がL1
xargs
プログラムに指示します
あなたが唯一のまともなファイル名を持っている場合、あなたはこのように単純化することができます。
find some/path | xargs program
または
find some/path | xargs -L1 program
最後に、programに引数が複数指定されている場合は、-i
と{}
を組み合わせて使用できます。例えば。他の細かい回答に加え
find some/path | xargs -i program param1 param2 {} param4
、GNUは、(少なくとも)を見つける-quit
述語を有する:
find path -other -predicates \(-exec cmd {} \; -o -quit \)
-quit
述語はcertainly non-standardあり、BSDの検索には存在しません。
(の必要性:ここで
これは私が必要とするものに近いですが、これが失敗した場合は終了しないで終了する必要があります(述語の第2部分)。 – Lucas
% _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}\" "{}" +
は(私のためexacltyの仕事をしませんでした小次郎の回答に基づいて)最初のコンパイラエラー を打った後停止し、「ビルドシステム」、のための私の例であります括弧がエスケープされているのは本当です。私はそれが痛いことを知っています。)
現在のディレクトリ以下にある基本的にすべてのC++ファイルの静的ライブラリを構築したいと考えています。私は、ファイル-print
-edを持ちたいコンパイラを実行する前に
、その後-exec
-edが、それは(を失敗し、stderr
のエラーを離れるとき、それが必要-quit
。
-a
が&&
と-o
のようなものは次のようです括弧なしのシェルまたはC.
で||
、GNUがある、最初の最も可能性の条件を試みることによって、クエリを「最適化」を見つける - 私は推測する - 。-quit
は
関連:http://unix.stackexchange.com/questions/62880/how-to-stop-the-find-command-after-first-match – kojiro