-execが失敗した場合にfindから抜け出す


14

ファイルの操作のfindいずれ-execかが失敗した場合に壊れるようにを記述する方法はありますか?

たとえば(javacいくつかのファイルで終了コード1を返すことができるプログラムとして便利に使用され、他の理由はありません):

$ echo "public classXX A{}" >> A.java
$ echo "public class B{}" >> B.java
$ find . -iname \*.java -exec javac {} \;
./A.java:1: error: class, interface, or enum expected
public classXX A{}
       ^
1 error

上記の例execでは、ファイルのがA.java失敗し(終了コード1を返しました)、findコマンドは続行され、ファイルB.javaもコンパイルされました。脱出する方法はありfindますか、for代わりに何らかの形式を使用する必要がありますか?

findの私のバージョン:

$ find -version  | head -1
find (GNU findutils) 4.4.2

回答:


5

おもう...

find ... -exec sh -c 'cmd "$0" || kill $PPID' \{\} \;

...ほぼすべてのトリックを実行する必要がありますfind


@Gillesに感謝します。何をし$0ますか?
mikeserv 14

1
$0は最初の引数sh -c$12番目など)—従来は実行されているプログラムの名前ですが、ここではスニペットを実行し、処理され$0ているファイル名を何らかの意味で渡します(たとえば、簡単にわかります)でps)。$0常に実行可能であるべきであり、あなたが書くsh -c 'cmd "$1" …' sh {}か、またはそのようなものであるべきであると述べる考え方の学校(私は明らかに属していません)があります。
ジル 'SO-悪であるのをやめる' 14

@Gilles-とても滑らか。どうもありがとう。幼稚園に行く途中の車でそれを見つけましたが、数分間考えなければなりませんでした。それは賢い-私はそれを使用するつもりです。実際にクリックしてくれたのは、Stephaneが自分の投稿の1つを読んで、彼find-sh $0findステートメントの最後に追加したことを思い出した編集です。私の意見ではこれはもっと便利に思えますが、最も重要なのは長期的にはあなたが望んでいることだと思います。
mikeserv 14

上記のケースでは機能しません。後find . -iname \*.java -exec sh -c 'javac "${0}" || kill '$$ {} \;のファイルはA.java失敗し、まだ、ファイルB.javaがコンパイルされます。
マーカスジュニウスブルータス14

@MarcusJuniusBrutus-修正しました。先にあなたのコメントを見たはずです。繰り返しますが、ごめんなさい。
mikeserv 14年

4

少なくともGNUでは、find次のものを使用できます。

find ... -exec ... -o -quit

execが停止して-oが開始する場所を明確にするのに問題があるようです。両方find . -iname \*.java -exec javac {} -o -quit \;find . -iname \*.java -exec javac {} \; -o -quit \;失敗(異なる方法で)
マーカスジュニウスブルータス14年

@MarcusJuniusBrutusはで\;必要です-exec(つまり-o -quit、この場合は以前)が、他にはないかもしれません。
ホークレイジング14年

2
使用-exec ... -o -quitしてもうまくいきません。それは処理されません任意のファイルを。ただし、この行は機能します。find . -iname \*.java -not -exec javac '{}' \; -quit:がfalseの-quit場合に呼び出され-execます。ゼロ以外で戻ります。
サヴァント14年

find . -iname \*.java -exec javac {} \; -o -quitも、ファイルの処理に失敗します。不思議なことに、find . -iname \* -exec echo 'foo' \; -o -quit ない「プロセス」のファイルを。
マーカスジュニウスブルータス14年

0

findマニュアルを参照してください。@Haukeの答えは私を見てやる気を起こさせ、QNXの検索-abortにはGNU -quitオプションに似ているオプションがあります。私が使用し\(\)式をグループ化すると、私にとってはうまくいきます:

find . -mtime -4 -name <pattern> \( -exec my_cmd {} \; -o  -abort \) 

注:括弧がないと、最初のファイルで中断します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.